近期在将servlet版本的项目改成springboot时使用Apache Commons FileUpload组件上传文件时总是返回null,调试发现ServletFileUpload对象为空,刚开始以为是请求request改变的原因,后面经过调试查找资料才发现在Spring Boot中有默认的文件上传组件。
调试发现每次运行到这一步之后的size返回的是0,没有值存在。
接下来我们在SpringBoot中使用 commons-fileupload 上传文件。
方式一
1.pom.xml中添加依赖
<!-- 文件上传所依赖的jar包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2.进行使用
@RequestMapping("/doUpload")
public String doUpload(HttpSession session, HttpServletRequest request) throws IOException {
long startTime = System.currentTimeMillis();
//获取存储app文件夹的路径
String appPath = session.getServletContext().getRealPath("/app");
File appRootDir = new File(appPath);
if (!appRootDir.exists()) {
System.out.println("存储app的文件夹不存在 appPath= " + appPath);
appRootDir.mkdirs();
} else {
System.out.println("存储app的文件夹存在 appPath= " + appPath);
}
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator<String> names = multiRequest.getFileNames();
while (names.hasNext()) {
MultipartFile file = multiRequest.getFile(names.next().toString());
if (file != null) {
File appFile = new File(appRootDir, file.getOriginalFilename());
file.transferTo(appFile);
}
}
}
long endTime = System.currentTimeMillis();
System.out.println("上传时间:" + String.valueOf(endTime - startTime) + "ms");
return "home";
}
}
方式二
1.pom.xml中添加依赖(同上)
2.进行使用
private List<FileItem> getFile(HttpServletRequest request) {
// 获得磁盘文件条目工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 如果没以下两行设置的话,上传大的文件会占用很多内存,
// 设置暂时存放的存储室 ,这个存储室,可以和最终存储文件的目录不同
/**
* 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tmp
* 格式的 然后再将其真正写到 对应目录的硬盘上
*/
String TEMP_FOLDER = "bb";
factory.setRepository(new File(TEMP_FOLDER));
// 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
factory.setSizeThreshold(1024 * 1024);
// 高水平的API文件上传处理
ServletFileUpload upload = new ServletFileUpload(factory);
// 提交上来的信息都在这个list里面
// 这意味着可以上传多个文件
// 请自行组织代码
List<FileItem> list = null;
try {
list = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
3.使用此方式的最重要一步(在配置文件中添加配置)
去过滤掉springmvc的文件操作(如果使用的是springmvc框架可以去配置中删除即可,此因为springboot集成无法删除)