首页 > Web开发 > 详细

文件上传

时间:2016-06-24 12:52:14      阅读:129      评论:0      收藏:0      [点我收藏+]

文件上传:
commons-fileupload-1.2.1.jar
commons-io-2.0.jar

文件上传中三个重要的API:
1.org.apache.commons.fileupload.disk.DiskFileItemFactory: 创建 FileItem 实例的工厂
三个重要的方法:
(1)setSizeThreshold(int sizeThreshold):设置阀值的大小,该阀值决定了上传的文件是保存在内存中还是保存在临时文件中。参数为字节。默认值为:Size threshold is 10KB.
(2)setRepository(File repository):指定上传临时目录,默认值为 System.getProperty("java.io.tmpdir")。
(3)DiskFileItemFactory(int sizeThreshold, File repository)。

2.org.apache.commons.fileupload.servlet.ServletFileUpload:处理文件上传的类,将表单的每一个输入项封装为一个 FileItem 对象。
(1)isMultipartContent(HttpServletRequest request): 判断表单上传类型是否以 "multipart/" 开头。
(2)ServletFileUpload(FileItemFactory fileItemFactory):构造方法,传入FileItemFactory实例。
(3)List /* FileItem */ parseRequest(HttpServletRequest request):解析 request 对象,并把表单中的每一个输入项包装成一个 fileItem 项,并返回FileItem的list集合。
(4)setFileSizeMax(long fileSizeMax):设置单个上传文件的最大值,参数为字节。
(5)setSizeMax(long sizeMax):设置上传文件总量的最大值
(5)setHeaderEncoding(java.lang.String encoding):设置编码格式

3.FileItem: keep their content either in memory,for smaller items, or in a temporary file on disk, for larger items.

步骤:
1.创建 DiskFileItemFactory 对象,设置缓冲区大小,和临时文件目录
2.使用 DiskFileItemFactory 对象创建 ServletFileUpload 对象,判断isMultipartContent(req)并设置上传文件的大小限制。
3.使用 ServletFileUpload 的 parseRequest(req) 方法,得到保存所有上传对象的 List FileItem 对象。
4.对 List<FileItem> 对象进行迭代,每迭代一个 FileItem 对象,调用其 isFormField() 方法判断其是否是上传文件。
5.若是上传文件,通过 FileItem 的 getFieldName() 获取字段名,通过 getName() 获取文件名这里需要注意一个问题。
需要注意的问题:

通过 FileItem 的 getName() 方法获取到的是:
IE下:
C:\Users\sovlerpeng\Desktop\2016-06-06_172310.png
Chrome下:
2016-06-06_172310.png

需要对IE下的文件名进行处理。
6.调用 FileItem 的 write(File file) 方法,将缓存的文件写到真实的文件目录里。

细节问题:
1.当上传文件超出设置的阀值大小时,Commons-fileupload 将使用临时文件存储上传数据。
2.文件位置:为防止上传相同文件名的文件,而导致文件被覆盖,所以应该保证上传的文件具有唯一名。
3.为防止单个目录下文件过多,影响文件读写速度,处理上传文件的类型或时间或其他,生成不同的目录,将文件分散存储。

4.文件上传速度
(1) ProgressListener显示上传进度
ProgressListenerprogressListener = new ProgressListener() {
public void update(longpBytesRead, long pContentLength, int pItems) {
System.out.println("到现在为止, " + pBytesRead + " 字节已上传,总大小为 " + pContentLength);
}
};
upload.setProgressListener(progressListener);
(2)以KB为单位显示上传进度
long temp = -1; //temp注意设置为类变量
long ctemp =pBytesRead /1024;
if (mBytes ==ctemp)
return;
temp = mBytes

5.
1字节=8位
1kb = 1024字节
1mb = 1024kb
1gb = 1024mb
1tb = 1024gb

例子:
UploadUtils.java

public class UploadUtils {
  public static <T> void doUpload(UploadCondition condition,HttpServletRequest request, T target) throws FileSizeLimitExceededException,SizeLimitExceededException,FileTypeException,Exception {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setSizeMax(condition.getTotalSize());
    upload.setFileSizeMax(condition.getFileSize());
    List<FileItem> items = upload.parseRequest(request);
    for (FileItem fileItem : items) {
      if(fileItem.isFormField()) {
        String name = fileItem.getFieldName();
        String value = fileItem.getString("UTF-8");
        BeanUtils.copyProperty(target, name, value);
      }else{
        String fieldName = fileItem.getFieldName();
        String fileName = fileItem.getName();
        String contentType = fileItem.getContentType();
      if(!condition.getAllowedTypes().contains(contentType)) {
        throw new FileTypeException("文件类型不合法");
      }
      if(fileName.contains("\\")) {
        int lastIndexOf = fileName.lastIndexOf("\\");
        fileName = fileName.substring(lastIndexOf+1);
      }
      fileName = System.currentTimeMillis() + fileName;
      BeanUtils.copyProperty(target, fieldName, condition.getFolder() + "/" + fileName);
      String realPath = request.getSession().getServletContext().getRealPath("/"+condition.getFolder());
      File file = new File(realPath+"/"+fileName);
      fileItem.write(file);
    }
  }
  }
}

 

UploadCondition.java

/**
* 封装文件上传时需要使用的条件数据
* 为每一个属性指定默认值,如果使用默认值则可以调用无参的构造器创建对象
*
*/
public class UploadCondition {
    private long fileSize = 100*1024;
    private long totalSize = 200*1024;
    private List<String> allowedTypes =             Arrays.asList("image/jpeg","image/gif");
    private String folder = "upload";
    public UploadCondition() {
    }
  public UploadCondition(Long fileSize, Long totalSize, List<String> allowedTypes, String folder) {
    super();
    if(fileSize != null) {
      this.fileSize = fileSize;
    }
    if(totalSize != null) {
      this.totalSize = totalSize;
    }
    if(allowedTypes != null) {
      this.allowedTypes = allowedTypes;
    }
    if(folder != null) {
      this.folder = folder;
    }
  }

  public long getFileSize() {
    return fileSize;
  }

  public void setFileSize(long fileSize) {
    this.fileSize = fileSize;
  }

  public long getTotalSize() {
    return totalSize;
  }

  public void setTotalSize(long totalSize) {
    this.totalSize = totalSize;
  }

  public List<String> getAllowedTypes() {
    return allowedTypes;
  }

  public void setAllowedTypes(List<String> allowedTypes) {
    this.allowedTypes = allowedTypes;
  }

  public String getFolder() {
    return folder;
  }

  public void setFolder(String folder) {
    this.folder = folder;
  }
}

FileTypeException.java

public class FileTypeException extends RuntimeException{
    public FileTypeException() {
        super();
    }
    public FileTypeException(String message, Throwable cause,
        boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
    public FileTypeException(String message, Throwable cause) {
        super(message, cause);
    }
    public FileTypeException(String message) {
        super(message);
    }
    public FileTypeException(Throwable cause) {
        super(cause);
    }
}

 

UploadServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  User user = new User();
  UploadCondition condition = new UploadCondition();
  condition.setTotalSize(1000*1024);
  try {
    UploadUtils.doUpload(condition, request, user);
  } catch (FileSizeLimitExceededException e) {
    e.printStackTrace();
    request.setAttribute("message", "单个文件大小不要超过:"+condition.getFileSize());
    request.getRequestDispatcher("/regist.jsp").forward(request, response);
    return ;
  } catch (SizeLimitExceededException e) {
    e.printStackTrace();
    request.setAttribute("message", "总文件大小不要超过:"+condition.getTotalSize());
    request.getRequestDispatcher("/regist.jsp").forward(request, response);
    return ;

  } catch (FileTypeException e) {
    e.printStackTrace();
    request.setAttribute("message", e.getMessage());
    request.getRequestDispatcher("/regist.jsp").forward(request, response);
    return ;

  } catch (Exception e) {
    e.printStackTrace();
  }

  request.setAttribute("user", user);
  request.getRequestDispatcher("/result.jsp").forward(request, response);

}

 

文件上传

原文:http://www.cnblogs.com/solverpeng/p/5613727.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!