学习的目标
使用commons-fileupload实现文件上传
使用commons-fileupload封装文件上传工具类
 
什么是commons-fileupload?
The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.
FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller.
 
FileUpload包可以很容易地添加强大的,高性能,文件上传到你的Servlet的Web应用程序的能力。
FileUpload解析HTTP请求符合RFC 1867年,“在HTML的文件上传。就是说,如果一个HTTP请求是使用POST方法提交,并与一个内容类型“multipart/form-data”,然后FileUpload可以解析这个请求,并把结果提供一个容易使用的调用方式。
 
为什么要使用commons-fileupload
在使用传统的Servlet上传的时候我们可以使用req.getInputStream()来获取文件上传的流,我们在获取到这个流之后需要手动的针对这个流进行特殊处理进行去流中不必要的开始和结束内容,才能真正的获取到流的内容,本章节并不对原始Servlet的上传进行探究,我们另开章节针对原始Servelt上传进行探究。
 
使用commons-fileupload的要求
  1. method方法必须是POST,不能是GET
  2. 新加一个属性enctype,值为”multipart/form-data”
  3. 文件表单项<input>的类型为file,即type=”file”
commons-fileupload的Maven依赖 
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
使用commons-fileupload核心步骤解读
第一步:判断是否可以进行文件上传
第二步:创建一个FileItem工厂,通过工厂创建文件上传核心组件ServletFileUpload对象
第三步:通过核心上传组件解析request请求,获取表单的所有表单项,表单的每一个表单项对应一个FileItem
 
第四步:遍历所有的表单项,判断是否是普通的表单项,如果不是就是文件上传,就可以针对遍历的这个fileItem进行一系列的操作
封装一个工具类,让我们在处理文件上传的时候爽呀爽
在上面我们已经介绍过了使用commons-fileupload上传文件的整个流程,所以我们就直接将这个流程封装成一个工具类,在使用到文件上传的Servlet中直接使用,十分便利
第一步:创建一个DTO(用于存储commons-fileupload解析请求的结果) 
import org.apache.commons.fileupload.FileItem;

import java.util.HashMap;
import java.util.Map; public class ParamDto { private Map<String,String> paramMap;
private Map<String,FileItem> fileMap; public ParamDto() {
paramMap = new HashMap<>();
fileMap = new HashMap<>();
} public Map<String, String> getParamMap() {
return paramMap;
} public void setParamMap(Map<String, String> paramMap) {
this.paramMap = paramMap;
} public Map<String, FileItem> getFileMap() {
return fileMap;
} public void setFileMap(Map<String, FileItem> fileMap) {
this.fileMap = fileMap;
}
}
第二步:将commons-fileupload解析文件的整个请求,封装成一个工具类
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.imooc.dto.ParamDto; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List; public class RequestUtil { /**
* 从request流中解析参数与上传的文件
* @param request
*/
public static ParamDto parseParam(HttpServletRequest request) { ParamDto result = new ParamDto(); //创建一个FileItem工厂 通过DiskFileItemFactory对象创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
upload.setHeaderEncoding("UTF-8"); try {
//通过文件上传核心组件解析request请求,获取到所有的FileItem对象
List<FileItem> fileItemList = upload.parseRequest(request); //遍历表单的所有表单项(FileItem) 并对其进行相关操作
for(FileItem fileItem : fileItemList) {
//判断这个表单项如果是一个普通的表单项
if(fileItem.isFormField()) {
result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
//如果不是表单的普通文本域,就是
} else {
result.getFileMap().put(fileItem.getFieldName(),fileItem);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
第三步:让我们直接在Servlet中使用这个工具类吧,哈哈
 
另:我们当然可以封装一个保存文件(Item)的一个通用方法
import org.apache.commons.fileupload.FileItem;

import java.io.File;

public class FileUtil {

    /**
* 上传文件的保存路径
*/
public static final String SAVE_PATH = "d:/upload/"; /**
* 保存上传的文件
* @param fileItem
* @param path
* @return
* @throws Exception
*/
public static String save(FileItem fileItem,String path) throws Exception {
String fileName = System.currentTimeMillis() + "_" + fileItem.getName();
fileItem.write(new File(path + fileName));
return fileName;
}
}

好啦~ 有空我们再来看看原始的文件上传方式

 

Java使用Commons-FileUpload组件实现文件上传最佳方案的更多相关文章

  1. 模拟文件上传(二):使用apache fileupload组件进行文件上传

    其中涉及到的jar包: jsp显示层: <%@ page language="java" import="java.util.*" pageEncodin ...

  2. 使用commons-fileupload-1.2.1.jar等组件实现文件上传

    使用的主要jar包:commons-io-1.3.2.jar包;commons-fileupload-1.2.1.jar包:commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前 ...

  3. jsp实现文件上传(二)用cos组件实现文件上传

    jsp表单 <%@ page language="java" pageEncoding="utf-8"%> <html> <hea ...

  4. jquery组件WebUploader文件上传用法详解

    这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

  5. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  7. 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题

    response.setContentType("text/html; charset=UTF-8");  Boolean isMultipart = ServletFileUpl ...

  8. Commons组件实现文件上传与下载

    一.文件上传 所需jar包 首先是commons-fileupload.jar包 其次是commons-IO.jar包 前者的使用依赖后者,两者缺一不可 实现 前台要求 在前台提交的form表单请求方 ...

  9. dwz+jquery+fileupload+springmvc实现文件上传 及图片预览

    1 前台jsp:文件的上传利用了iframe实现局部刷新功能.使用了apache的fileupload组件,用到的jar: commons-fileupload.jar,commons-io.jarD ...

随机推荐

  1. connect: Network is unreachable解決方法

    connect: Network is unreachable解決方法   解決方式:請確認ifcfg-eth0檔案設定 指令如下:   vi /etc/sysconfig/network-scrip ...

  2. try、finally代码块有无return时的执行顺序

    结论: 1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并 ...

  3. Java数据结构和算法(三):常用排序算法与经典题型

    常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...

  4. iOS代码技巧之判断设备及状态

    转自:http://my.oschina.net/joanfen/blog/149076 一.判断设备 01 //设备名称 02 return [UIDevice currentDevice].nam ...

  5. SVN 安装后报不是内部或外部命令

    SVN安装后报不是内部或外部命令,也不是可运行的程序 解决方法:windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将 ...

  6. cookie,session,localStage,sessionStage区别

    Cookie和Session详解 1.什么是Cookie Cookie是存放在客户端浏览器的Name/Value键值对,访问服务器时,会自动传递给服务器. Cookie的生成方式有两种,服务器写入,客 ...

  7. CSS 命名规范总结

    CSS 命名规范总结 BEM 命名给 CSS 以及 html 提供清晰结构,命名空间提供更多信息,模块化提高代码的重用,以达到 CSS 命名语义化.可重用性高.后期维护容易.加载渲染快的要求. 首先, ...

  8. 基于CSS3 3D百叶窗图像过渡特效

    你可能已经在网上看到过不少使用jQuery制作的百叶窗效果,我们可不可以使用纯CSS来完成这项工作呢?答案是肯定的.我们不仅可以制作出这种百叶窗效果,还可以使它具有响应性. 在线预览   源码下载 要 ...

  9. 一款基于jQuery的图片下滑切换焦点图插件

    之前为大家分享了好多款jquery插件,今天我们要分享的一款jQuery插件也比较实用,是一款jQuery焦点图插件.焦点图相当普通,一共可以循环播放4张图片,并且每一张图片在切换的时候都是向下滑动的 ...

  10. 让浏览器下载文件http头部

    网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同. 效果如下图:  Content-Disposition 使用 HTTP Header 的 ...