MultipartFile 源码

package org.springframework.web.multipart;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.core.io.InputStreamSource;public interface MultipartFile extends InputStreamSource {String getName();String getOriginalFilename();String getContentType();boolean isEmpty();long getSize();byte[] getBytes() throws IOException;InputStream getInputStream() throws IOException;void transferTo(File var1) throws IOException, IllegalStateException;
}

CommonsMultipartFile 部分源码

package org.springframework.web.multipart.commons;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.StreamUtils;
import org.springframework.web.multipart.MultipartFile;public class CommonsMultipartFile implements MultipartFile, Serializable {protected static final Log logger = LogFactory.getLog(CommonsMultipartFile.class);private final FileItem fileItem;private final long size;private boolean preserveFilename = false;public CommonsMultipartFile(FileItem fileItem) {this.fileItem = fileItem;this.size = this.fileItem.getSize();}/***  获取上传文件的原文件名*/public String getOriginalFilename() {String filename = this.fileItem.getName();if (filename == null) {return "";} else if (this.preserveFilename) {return filename;} else {int unixSep = filename.lastIndexOf(47);int winSep = filename.lastIndexOf(92);int pos = winSep > unixSep ? winSep : unixSep;return pos != -1 ? filename.substring(pos + 1) : filename;}}/***    获取上传文件的文件输入流*/public InputStream getInputStream() throws IOException {if (!this.isAvailable()) {throw new IllegalStateException("File has been moved - cannot be read again");} else {InputStream inputStream = this.fileItem.getInputStream();return inputStream != null ? inputStream : StreamUtils.emptyInput();}}/***   将CommonsMultipartFile 转化成 File , 即将上传的文件写入指定文件*/public void transferTo(File dest) throws IOException, IllegalStateException {if (!this.isAvailable()) {throw new IllegalStateException("File has already been moved - cannot be transferred again");} else if (dest.exists() && !dest.delete()) {throw new IOException("Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");} else {try {this.fileItem.write(dest);if (logger.isDebugEnabled()) {String action = "transferred";if (!this.fileItem.isInMemory()) {action = this.isAvailable() ? "copied" : "moved";}logger.debug("Multipart file '" + this.getName() + "' with original filename [" + this.getOriginalFilename() + "], stored " + this.getStorageDescription() + ": " + action + " to [" + dest.getAbsolutePath() + "]");}} catch (FileUploadException var3) {throw new IllegalStateException(var3.getMessage(), var3);} catch (IllegalStateException var4) {throw var4;} catch (IOException var5) {throw var5;} catch (Exception var6) {throw new IOException("File transfer failed", var6);}}}}

异同:

1、MultipartFile 和 CommonsMultipartFile都是用来接收上传的文件流的 !

2、MultipartFile是一个接口,CommonsMultipartFile是MultipartFile接口的实现类 !

3、使用MultipartFile作为形参接收上传文件时,直接用即可。CommonsMultipartFile作为形参接收上传文件时,必需添加@RequestParam注解(否则会报错:exception is java.lang.NoSuchMethodException: org.springframework.web.multipart.commons.CommonsMultipartFile)

MultipartFile

@RequestMapping(value = "/uploadFile")
@ResponseBody //@ResponseBody注解会将这个方法的返回值转换为JSON形式的数据,返回到response中,可以抽象理解成response.getWriter.write(JSON.toJSONString(map));
public Map<String,Object> uploadFile(MultipartFile uploadFile, HttpServletRequest request) throws IOException {Map<String,Object> map = new HashMap<String, Object>();//判断文件是否成功上传if(uploadFile!=null){// 获取上传文件的原文件名String fileName = uploadFile.getOriginalFilename();// 获取上传文件的后缀名String suffix=fileName.substring(fileName.lastIndexOf("."));// 给文件定义一个新的名称,杜绝文件重名覆盖现象 (UUID是全球唯一id)String newFileName= UUID.randomUUID().toString()+suffix;// 指定文件存储目录String basePath = "C:/Users/CD4356/Pictures/image/";// 创建File对象,注意这里不是创建一个目录或一个文件,你可以理解为是 获取指定目录中文件的管理权限(增改删除判断等 . . .)File tempFile=new File(basePath);// 判断File对象对应的目录是否存在if(!tempFile.exists()){// 创建以此抽象路径名命名的目录,注意mkdir()只能创建一级目录,所以它的父级目录必须存在tempFile.mkdir();}//拼接文件存储的绝对路径String path = basePath + newFileName;// 在指定路径中创建一个文件(该文件是空的)File file=new File(path);try{// 将上传的文件写入指定文件uploadFile.transferTo(file);map.put("success",true);}catch (Exception e){map.put("success",false);map.put("errorMsg",e.getMessage());return map;}}return map;
}

CommonsMultipartFile

@RequestMapping(value = "/uploadFile")
@ResponseBody //@ResponseBody注解会将这个方法的返回值转换为JSON形式的数据,返回到response中,可以抽象理解成response.getWriter.write(JSON.toJSONString(map));
public Map<String,Object> uploadFile(@RequestParam CommonsMultipartFile uploadFile, HttpServletRequest request) throws IOException {Map<String,Object> map = new HashMap<String, Object>();//判断文件是否成功上传if(uploadFile!=null){// 获取上传文件的原文件名String fileName = uploadFile.getOriginalFilename();// 获取上传文件的后缀名String suffix=fileName.substring(fileName.lastIndexOf("."));// 给文件定义一个新的名称,杜绝文件重名覆盖现象 (UUID是全球唯一id)String newFileName= UUID.randomUUID().toString()+suffix;// 指定文件存储目录String basePath = "C:/Users/CD4356/Pictures/image/";// 创建File对象,注意这里不是创建一个目录或一个文件,你可以理解为是 获取指定目录中文件的管理权限(增改删除判断等 . . .)File tempFile=new File(basePath);// 判断File对象对应的目录是否存在if(!tempFile.exists()){// 创建以此抽象路径名命名的目录,注意mkdir()只能创建一级目录,所以它的父级目录必须存在tempFile.mkdir();}//拼接文件存储的绝对路径String path = basePath + newFileName;// 在指定路径中创建一个文件(该文件是空的)File file=new File(path);try{// 将上传的文件写入指定文件uploadFile.transferTo(file);map.put("success",true);}catch (Exception e){map.put("success",false);map.put("errorMsg",e.getMessage());return map;}}return map;
}

当然,我们也可以不在方法中定义MultipartFile 或 CommonsMultipartFile来接收文件信息,而是从request请求中获取。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>CommonsMultipartFile</title>
</head>
<body>
<div><form action="uploadFile" method="post" enctype="multipart/form-data"><input type="file" name="uploadFile" accept="image/*"><br><br><input type="submit" value="上传"></form>
</div>
</body>
</html>
@Controller
public class UploadController {@RequestMapping("to_upload")public String toUpload(){return "upload_file";}@RequestMapping(value = "/uploadFile")@ResponseBody //@ResponseBody注解会将这个方法的返回值转换为JSON形式的数据,返回到response中,可以抽象理解成response.getWriter.write(JSON.toJSONString(map));public Map<String,Object> uploadFile(HttpServletRequest request) throws IOException {Map<String,Object> map = new HashMap<String, Object>();//创建一个CommonsMultipartFile对象,获取上传到request中的文件CommonsMultipartFile uploadFile = null;//创建文件解析器(目的是调用该对象的isMultipart方法来检测request请求中是否有上传文件)CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());//判断request中是否有上传文件流if(multipartResolver.isMultipart(request)){//将request转为MultipartHttpServletRequestMultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;//从request中获取key名为uploadFile的文件,并保存的CommonsMultipartFile对象中uploadFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("uploadFile");}// 获取上传文件的原文件名String fileName = uploadFile.getOriginalFilename();// 获取上传文件的后缀名String suffix=fileName.substring(fileName.lastIndexOf("."));// 给文件定义一个新的名称,杜绝文件重名覆盖现象 (UUID是全球唯一id)String newFileName= UUID.randomUUID().toString()+suffix;// 指定文件存储目录String basePath = "C:/Users/CD4356/Pictures/image/";// 创建File对象,注意这里不是创建一个目录或一个文件,你可以理解为是 获取指定目录中文件的管理权限(增改删除判断等 . . .)File tempFile=new File(basePath);// 判断File对象对应的目录是否存在if(!tempFile.exists()){// 创建以此抽象路径名命名的目录,注意mkdir()只能创建一级目录,所以它的父级目录必须存在tempFile.mkdir();}//拼接文件存储的绝对路径String path = basePath + newFileName;// 在指定路径中创建一个文件(该文件是空的)File file=new File(path);try{// 将上传的文件写入指定文件uploadFile.transferTo(file);map.put("success",true);}catch (Exception e){map.put("success",false);map.put("errorMsg",e.getMessage());return map;}return map;}}

MultipartFile和CommonsMultipartFile的区别!相关推荐

  1. File转化为MultipartFile

    File 转 MultipartFile 引入以下依赖: <dependency><groupId>commons-fileupload</groupId>< ...

  2. 项目需求--将文件(html格式的字符串)转换为MultipartFile格式的文件然后转调第三方接口

    网上看了很多,但是不符合需求不说,还有很多都不能用....自己就整理了下相关的代码,可能会有点乱,自己理解着看 根据url地址将文件转换成MultipartFile格式的文件 /*** @descri ...

  3. HTTP传递文件和接收文件处理之MultipartFile

    1. 什么是MultipartFile? MultipartFile是spring用来处理文件封装的一个接口,继承自InputStreamSource,而InputStreamSource接口中封装了 ...

  4. MultipartFile与File的一些事

    前言 前段时间碰到了中转文件的需求,需要使用HttpClient中转一下文件,过程为: 在实现这个需求的过程中就用得到了MultipartFile与File,而且我对前一个也不是很熟悉.记录一下 什么 ...

  5. Java URL转换MultipartFile对象(文件URL传输类型接口)

    分享一个最近对接企微上传附件接口的方法. 业务实现需要将网络地址URL图片转换成MultipartFile对象并对接企微接口,这是目前看到相对简洁的方法调用. /*** url转变为 Multipar ...

  6. 【工具】文件格式转换:File,FileItem,MultipartFile

    目录 引入以下依赖: File:: FileItem: MultipartFile: 引入以下依赖: <dependency><groupId>commons-fileuplo ...

  7. java二维码生成并可以转换

    二维码很常见,简单的二维码生成 pom中导入两个包 <!--二维码--><dependency><groupId>com.google.zxing</grou ...

  8. Java代码小demon(一)SpringBoot+二维码和条形码生成

    1. 简介 原由 需要一个工具类,可以将数据存储在二维码中,通过扫一扫可以获取到信息,条形码不能接受中文字符 收藏和转载以及自己应用时拓展,具体实现和底层原理还不会,有时间我会去了解或者忘记 借鉴博客 ...

  9. springboot MVC视图解析流程源码分析

    Servlet的基础知识 为什么要先了解Servlet的知识呢,因为后面你会看到我们所熟悉的SpringMVC其实也是一个Servlet,只是它封装了很多的东西并和Spring进行了整合,后面我们进行 ...

最新文章

  1. PNAS:人工构建玉米极简微生物组
  2. GAC中部署assembly的问题总结
  3. Memcached服务器的图形化管理工具
  4. python3输入输出_Python3 输入和输出
  5. nandflash与文件系统,oob区数据扫盲。后面还会补充实际生产烧录的心得体验,依据不同的文件系统
  6. 可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班
  7. 1090 Highest Price in Supply Chain (25 分)
  8. Hadoop的Python框架指南
  9. Java 常用类库 之 比较接口 Comparator
  10. 男人是房子,女人是车子
  11. ES6深入浅出_汇总贴
  12. bounds的深入研究
  13. 连接服务器显示用户账户无效,发现MT4真实账户无效该怎么办?
  14. ((亲测有效))安卓神器Xposed框架无ROOT使用指南
  15. 【转】常见英语单词前缀
  16. httpclient中警告Encrypted Alert后断开连接问题处理
  17. 字蛛font-spider报错,web font not found,碰到的最新问题及解决方法
  18. S5PV210 buzzer驱动
  19. 数据结构与算法(一) 链表(代码示例)
  20. 金融相关计算机面试题,银行及其他金融企业笔试和面试经验

热门文章

  1. Js 怎么遍历json对象所有key及根据动态key获取值(根据key值获取相应的value值)...
  2. 吴恩达【深度学习工程师】 04.卷积神经网络 第四周特殊应用(1)人脸识别
  3. dede织梦数据表字段解释
  4. Mr.J-- jQuery学习笔记(三十一)--事件操作方法(onoff)
  5. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面
  6. VC++判断文件或文件夹是否存在(转)
  7. 【codevs3160】 LCS 【后缀自动机】
  8. 重做LVM文件系统之减小PV
  9. centos7的systemd命令对比
  10. FreeSWITCH 下载地址