科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用JavaBean实现文件上载(二)上载文件

用JavaBean实现文件上载(二)上载文件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

众所周知,JavaBean是Java平台的软件组件,下面要实现的上载功能就是用JavaBean实现,所以它可以方便地应用到任何需要文件上载功能的应用之中。

作者:中国IT实验室 来源:中国IT实验室 2007年9月3日

关键字: 上载 JavaBean

  • 评论
  • 分享微博
  • 分享邮件
 上载文件
  众所周知,JavaBean是Java平台的软件组件,下面要实现的上载功能就是用JavaBean实现,所以它可以方便地应用到任何需要文件上载功能的应用之中。
  代码清单如下:
  package com.brainysoftware.web;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.ServletInputStream;
  import java.util.Dictionary;
  import java.util.Hashtable;
  import java.io.PrintWriter;
  import java.io.BufferedWriter;
  import java.io.FileWriter;
  import java.io.IOException;
  public class FileUploadBean {
  private String savePath, filepath, filename, contentType;
  private Dictionary fields;
  public String getFilename() {
  return filename;
  }
  public String getFilepath() {
  return filepath;
  }
  public void setSavePath(String savePath) {
  this.savePath = savePath;
  }
  public String getContentType() {
  return contentType;
  }
  public String getFieldValue(String fieldName) {
  if (fields == null || fieldName == null)
  return null;
  return (String) fields.get(fieldName);
  }
  private void setFilename(String s) {
  if (s==null)
  return;
  int pos = s.indexOf("filename=\"");
  if (pos != -1) {
  filepath = s.substring(pos+10, s.length()-1);
  // Windows浏览器发送完整的文件路径和名字
  // 但Linux/Unix和Mac浏览器只发送文件名字
  pos = filepath.lastIndexOf("\\");
  if (pos != -1)
  filename = filepath.substring(pos + 1);
  else
  filename = filepath;
  }
  }
  private void setContentType(String s) {
  if (s==null)
  return;
  
  int pos = s.indexOf(": ");
  if (pos != -1)
  contentType = s.substring(pos+2, s.length());
  }
  public void doUpload(HttpServletRequest request) throws IOException {
  ServletInputStream in = request.getInputStream();
  byte[] line = new byte[128];
  int i = in.readLine(line, 0, 128);
  if (i < 3)
  return;
  int boundaryLength = i - 2;
  
  String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符
  fields = new Hashtable();
  
  while (i != -1) {
  String newLine = new String(line, 0, i);
  if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
  if (newLine.indexOf("filename=\"") != -1) {
  setFilename(new String(line, 0, i-2));
  if (filename==null)
  return;
  //文件内容
  i = in.readLine(line, 0, 128);
  setContentType(new String(line, 0, i-2));
  i = in.readLine(line, 0, 128);
  //空行
  i = in.readLine(line, 0, 128);
  newLine = new String(line, 0, i);
  PrintWriter pw = new PrintWriter(new BufferedWriter(new
  FileWriter((savePath==null? "" : savePath) + filename)));
  while (i != -1 && !newLine.startsWith(boundary)) {
  // 文件内容的最后一行包含换行字符
  // 因此我们必须检查当前行是否是最
  // 后一行
  i = in.readLine(line, 0, 128);
  if ((i==boundaryLength+2 || i==boundaryLength+4)
  && (new String(line, 0, i).startsWith(boundary)))
  pw.print(newLine.substring(0, newLine.length()-2));
  else
  pw.print(newLine);
  newLine = new String(line, 0, i);
  
  }
  pw.close();
  
  }
  else {
  // 普通表单输入元素
  // 获取输入元素名字
  int pos = newLine.indexOf("name=\"");
  String fieldName = newLine.substring(pos+6, newLine.length()-3);
  
  i = in.readLine(line, 0, 128);
  i = in.readLine(line, 0, 128);
  newLine = new String(line, 0, i);
  StringBuffer fieldValue = new StringBuffer(128);
  while (i != -1 && !newLine.startsWith(boundary)) {
  // 最后一行包含换行字符
  // 因此我们必须检查当前行是否是最后一行
  i = in.readLine(line, 0, 128);
  if ((i==boundaryLength+2 || i==boundaryLength+4)
  && (new String(line, 0, i).startsWith(boundary)))
  fieldValue.append(newLine.substring(0, newLine.length()-2));
  else
  fieldValue.append(newLine);
  newLine = new String(line, 0, i);
  }
  fields.put(fieldName, fieldValue.toString());
  }
  }
  i = in.readLine(line, 0, 128);
  
  }
  }
  }
  代码的第一行是包声明,如果你不想让该类从属于任何包,可以删除这行代码。接下来的几行代码声明了该JavaBean所要引用的各个类和接口。
  FileUploadBean类有5个私有的属性(域),6个公用的方法,2个私有的方法。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章