MultipartFile的使用小结
Multipartfile转File?File转MultipartFile?可千万别转晕了。
题图:from Google
1. MultipartFile类型转File类型
想要将MultipartFile类型转为File类型可以使用MultipartFile提供的方法:void MultipartFile.transferTo(File dest) throws IOException, IllegalStateException
|
1
2
3
4
5
6
|
File destFile = new File("tmp/source/destFile");
if (!fileSourcePath.exists()) {
fileSourcePath.mkdirs();
}
// 将MultipartFile存到临时文件中
mulFileSource.transferTo(destFile);
|
2. File类型转Multipartfile
MultipartFile接口有两个常用实现类,MockMultipartFile和CommonsMultipartFile。
使用MockMultipartFile
看名字就知道MockMultipartFile主要用于测试用途,但是相对CommonsMultipartFile来说,创建相当简便。1234567File file = new File("/Users/coderec/Desktop/haha.jpg");MultipartFile mulFile = new MockMultipartFile("haha.jpg", //文件名"haha.jpg", //originalName 相当于上传文件在客户机上的文件名ContentType.APPLICATION_OCTET_STREAM.toString(), //文件类型new FileInputStream(file) //文件流);使用CommonsMultipartFile
与MockMultipartFile相比,CommonsMultipartFile仅仅有一个构造方法:CommonsMultipartFile(FileItem fileItem)
因此,若要使用CommonsMultipartFile来创建MultipartFile就一定要使用FileItem。通过FileItem将File转化为MultipartFile的过程如下伪代码所示:12345678910File file = new File("temp/fileItem/haha.jpg");if (!file.exists()) {file.mkdirs();}// 创建fileItem,具体方法参见第三节FileItem fileItem = new ...;// 将File内容写入fileItem,使用org.apache.commons.io.IOUtilsIOUtils.copy(new FileInputStream(file), fileItem.getOutputStream());// 创建multipartfileMultipartFile multipartFile = new CommonsMultipartFile(fileItem);
3. 如何创建FileItem?
FileItem接口只有一个实现类:DiskFileItem
直接使用DiskFileItem创建
123456789// 创建fileItemFileItem fileItem = new DiskFileItem("file", // 表单参数名ContentType.APPLICATION_OCTET_STREAM.toString(), // 文件类型false, // 是否为表单格式RandomKeyUtils.genRandomKey() + ".jpg", // 文件名10240, // 超过多少byte存在磁盘上new file("tmp/fileItem/") // 文件存储位置);使用DiskFileItemFactory创建
1234567891011// 小于5M文件都在内存中,否则存入硬盘final int tmpFileSize = 5242880;// 设置临时文件大小以及临时文件存储路径DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(tmpFileSize, new file("tmp/fileItem/"));// 创建fileItemFileItem fileItem = fileItemFactory.createItem("file", // 表单参数名ContentType.APPLICATION_OCTET_STREAM.toString(), // 文件类型false, // 是否为表单格式RandomKeyUtils.genRandomKey() + ".jpg" // 文件名);
4. DiskFileItem产生的临时文件处理
- 使用内存存储,不写入硬盘
在创建FileItem时,可以设定一个较大的文件大小,使文件不被写入硬盘,就不会产生临时文件的问题。不过这不是一个正确的解决问题的方式。而且,也会受到内存大小限制。 - 使用FileCleaningTracker
在使用DiskFileItemFactory时,应该会发现其有一个void setFileCleaningTracker(FileCleaningTracker pTracker)方法,此方法就是为临时文件设置监听线程,一旦发现临时文件被垃圾回收,就会清除临时文件。
我们可以通过FileCleanerCleanup监听器以及ServletContext获得监听线程FileCleaningTracker。
为FileItem设置监听的过程如下:
|
1
2
3
4
5
|
FileCleaningTracker fileCleaningTracker
= FileCleanerCleanup.getFileCleaningTracker(servletContext);
DiskFileItemFactory factory
= new DiskFileItemFactory(10240, File("tmp/fileItem/");
factory.setFileCleaningTracker(fileCleaningTracker);
|
在不需要监听线程FileCleaningTracker时,应该将其停止。可以在web.xml中进行如下配置:
|
1
2
3
4
5
6
7
8
9
|
<web-app>
...
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
...
</web-app>
|
- 获取ServletContext方法
- 普通Servlet中
使用HttpServletRequestrequest.getSession().getServletContext() - SpringMVC的Controller中
使用SpringMVC提供的方法
12WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();ServletContext servletContext = webApplicationContext.getServletContext();
MultipartFile的使用小结的更多相关文章
- 180730-Spring之RequestBody的使用姿势小结
Spring之RequestBody的使用姿势小结 SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种 根据 HttpServletRequest 对象获取 根据 @PathVa ...
- 导入解析excel小结
导入解析excel小结 控制器例子:
- 阿里出品Excel工具EasyExcel使用小结
前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExc ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- iOS--->微信支付小结
iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...
- iOS 之UITextFiled/UITextView小结
一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
随机推荐
- 在TFS 2013的敏捷组合管理中添加积压工作
在TFS提供的三套默认模板中,组合管理(Portfolio Management)只包含功能(Feature)和要求这个两个积压工作.你可以参考下面的文档,学会如何在积压工作中添加额外的工作项类型. ...
- C#中的类
C#编程语言,从本质上讲是一组类型声明.所以,本人认为第一个要区分的点是:类型!=类. 当然,如果想要系统的学习C#还是应该先了解一下.Net框架,本文目的只是从相对宏观的角度讲清楚C#中的类.关于类 ...
- ASP.NET Core学习总结(2)
public class ControllerActionInvoker : ResourceInvoker, IActionInvoker 我们知道,ControllerActionInvoker实 ...
- Ubuntu 12.04 Openssh 安装过程
1.输入 apt-get install openssh-server 注意 出现依赖 需要使用 查看依赖是否需要,如果不需要可以直接删除,sudo apt-get remove XXXX 或者sud ...
- 如何将JPG格式的图片转化为带地理坐标的TIFF格式
最近有个项目需要用到开源软件GeoServer,数据源是一张高分辨率的2.5维图片,格式是jpg的,由于GeoServer不支持jpg格式的发布,因此考虑到要进行格式转换,将其转换成tiff格式. 1 ...
- Chrome71版本使用screenfull.js全屏功能时报参数错误
在生产环境长期使用的一个“全屏”功能突然失效了,查看Console 如下报错: Failed to execute 'requestFullscreen' on 'Element': paramete ...
- 「BZOJ4318」OSU!
题目链接 戳我 \(Solution\) 我们考虑每增加一个\(1\)会对答案有什么影响: \[E((x+1)^3)-E(x^3)=E(3x^2+3x+1)=3E(x^2)+3E(x)+1\] 所以我 ...
- E - More is better (并查集)
点击打开链接 Mr Wang wants some boys to help him with a project. Because the project is rather complex, th ...
- robot framework学习笔记之九-杂记
Setup和Teardown 假设Suite1下面有Test1和Test2,若它们都设置了Setup和Teardown,那么它们的执行顺序是:Suite1-Setup->Test1-Setup- ...
- 部署LVS-DR群集
一.LVS-DR原理剖析 (一)LVS-DR数据包流向分析 1.Client向目标VIP发出请求,Director(负载均衡器)接收.此时IP包头及数据帧头信息为: 2.Director根据负载均衡算 ...