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来说,创建相当简便。


    1

    2

    3

    4

    5

    6

    7


    File 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的过程如下伪代码所示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10


    File file = new File("temp/fileItem/haha.jpg");

    if (!file.exists()) {

    file.mkdirs();

    }

    // 创建fileItem,具体方法参见第三节

    FileItem fileItem = new ...;

    // 将File内容写入fileItem,使用org.apache.commons.io.IOUtils

    IOUtils.copy(new FileInputStream(file), fileItem.getOutputStream());

    // 创建multipartfile

    MultipartFile multipartFile = new CommonsMultipartFile(fileItem);

3. 如何创建FileItem?

FileItem接口只有一个实现类:DiskFileItem

  • 直接使用DiskFileItem创建


    1

    2

    3

    4

    5

    6

    7

    8

    9


    // 创建fileItem

    FileItem fileItem = new DiskFileItem(

    "file", // 表单参数名

    ContentType.APPLICATION_OCTET_STREAM.toString(), // 文件类型

    false, // 是否为表单格式

    RandomKeyUtils.genRandomKey() + ".jpg", // 文件名

    10240, // 超过多少byte存在磁盘上

    new file("tmp/fileItem/") // 文件存储位置

    );

  • 使用DiskFileItemFactory创建

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11


    // 小于5M文件都在内存中,否则存入硬盘

    final int tmpFileSize = 5242880;

    // 设置临时文件大小以及临时文件存储路径

    DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(tmpFileSize, new file("tmp/fileItem/"));

    // 创建fileItem

    FileItem 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方法
    1. 普通Servlet中
      使用HttpServletRequest
      request.getSession().getServletContext()
    2. SpringMVC的Controller中
      使用SpringMVC提供的方法

      1

      2


      WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();

      ServletContext servletContext = webApplicationContext.getServletContext();

时间: 2024-10-10 21:34:33

MultipartFile的使用小结的相关文章

导入解析excel小结

导入解析excel小结 控制器例子:   一.   解析excel内容插入到数据库 Vm: <form id=’form_file’ method=’post’ enctype=’multipart/form-data’> <input id="uploadFile" type="file" name='uploadFile' /> <a href=’javascirpt(void0)’ onclick=’resolv();’>解

180730-Spring之RequestBody的使用姿势小结

Spring之RequestBody的使用姿势小结 SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种 根据 HttpServletRequest 对象获取 根据 @PathVariable 注解获取url参数 根据 @RequestParam 注解获取请求参数 根据Bean的方式获取请求参数 根据 @ModelAttribute 注解获取请求参数 对上面几种方式有兴趣的可以看一下这篇博文: SpringMVC之请求参数的获取方式 除了上面的几种方式之外,还有一种 @Req

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

【转载】小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作.之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求.NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样).在有些SAN环境下,这个选择可能是最好选择.Noop 对于 IO

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

安卓小结《1》

Activity的生命周期和启动模式的知识点小结: 1.如果Activity切换的时候,新Activity是透明,旧的不会走onStop方法. 2.新的Activity切换的时候,旧Activity  会先执行,onpause,然后才会启动新的activity. 3. Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onSt

date命令小结

在写linux shell脚本时,date是经常要用到的一个命令,这篇文章就此做个小结,以防自己用到时到处找 1.最基本的,显示当前的具体时期:直接敲入 date即可,如下, [email protected]:~/scripts$ date 2015年 01月 03日 星期六 21:46:49 CST 2.显示某个文件上次修改的时间:date -r file [email protected]:~/scripts$ date -r save.sh 2015年 01月 02日 星期五 23:29

java 小结2 多态问题。

面向对象这个东西,其实我们一直是不是都没有感觉到自己在用,以后我一定要用用.以前学c#时候认真的看过一次,最近一直研究java.随便再看看. 多态问题: 在java中多态分为(1)编译时多态和(2)运行时多态 (1)编译时多态比较容易理解:其实就是通过方法重载,就是方法的重载,同一个函数名但是可以参数不一样.这就是重载(so easy) (2)运行时多态:这个是通过方法覆盖实现的,就是子类在继承父类的时候,通过对某个方法的重写,覆盖父类方法. 简单的说:比如我们有个父类A,子类B通过Extend