前言

前段时间碰到了中转文件的需求,需要使用HttpClient中转一下文件,过程为:

在实现这个需求的过程中就用得到了MultipartFile与File,而且我对前一个也不是很熟悉。记录一下

什么是MultipartFile

MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。【来自百度知道】

MultipartFile 与 File 的 互相转换

1. File转MultipartFile

(1):使用org.springframework.mock.web.MockMultipartFile 需要导入spring-test.jar

public static void main(String[] args) throws Exception {String filePath = "F:\\test.txt";File file = new File(filePath);FileInputStream fileInputStream = new FileInputStream(file);// MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)// 其中originalFilename,String contentType 旧名字,类型  可为空// ContentType.APPLICATION_OCTET_STREAM.toString() 需要使用HttpClient的包MultipartFile multipartFile = new MockMultipartFile("copy"+file.getName(),file.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream);System.out.println(multipartFile.getName()); // 输出copytest.txt}

(2):使用CommonsMultipartFile

public static void main(String[] args) throws Exception {String filePath = "F:\\test.txt";File file = new File(filePath);// 需要导入commons-fileupload的包FileItem fileItem = new DiskFileItem("copyfile.txt", Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());byte[] buffer = new byte[4096];int n;try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){while ( (n = inputStream.read(buffer,0,4096)) != -1){os.write(buffer,0,n);}//也可以用IOUtils.copy(inputStream,os);MultipartFile multipartFile = new CommonsMultipartFile(fileItem);System.out.println(multipartFile.getName());}catch (IOException e){e.printStackTrace();}}
2. MultipartFile转File

(1):使用File转MultipartFile的逆过程
你在看这个代码的时候会觉得很熟悉,是的这个就是File转MultipartFile的逆转过程,这个方法会在根目录生成一个文件,需要删除该文件。

 public static void main(String[] args) throws Exception {int n;// 得到MultipartFile文件MultipartFile multipartFile = getFile();File f = null;// 输出文件的新name 就是指上传后的文件名称System.out.println("getName:"+multipartFile.getName());// 输出源文件名称 就是指上传前的文件名称System.out.println("Oriname:"+multipartFile.getOriginalFilename());// 创建文件f = new File(multipartFile.getOriginalFilename());try ( InputStream in  = multipartFile.getInputStream(); OutputStream os = new FileOutputStream(f)){// 得到文件流。以文件流的方式输出到新文件// 可以使用byte[] ss = multipartFile.getBytes();代替whilebyte[] buffer = new byte[4096];while ((n = in.read(buffer,0,4096)) != -1){os.write(buffer,0,n);}// 读取文件第一行BufferedReader bufferedReader = new BufferedReader(new FileReader(f));System.out.println(bufferedReader.readLine());// 输出路径bufferedReader.close();}catch (IOException e){e.printStackTrace();}// 输出file的URLSystem.out.println(f.toURI().toURL().toString());// 输出文件的绝对路径System.out.println(f.getAbsolutePath());// 操作完上的文件 需要删除在根目录下生成的文件File file = new File(f.toURI());if (file.delete()){System.out.println("删除成功");}else {System.out.println("删除失败");}}/**** @Description 返回MultipartFile文件* @return org.springframework.web.multipart.MultipartFile* @date 2019/1/5 11:08* @auther dell*/public static MultipartFile getFile() throws IOException {String filePath = "F:\\test.txt";File file = new File(filePath);FileItem fileItem = new DiskFileItem("copyfile.txt", Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());byte[] buffer = new byte[4096];int n;try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){while ( (n = inputStream.read(buffer,0,4096)) != -1){os.write(buffer,0,n);}//也可以用IOUtils.copy(inputStream,os);MultipartFile multipartFile = new CommonsMultipartFile(fileItem);System.out.println(multipartFile.getName());return multipartFile;}catch (IOException e){e.printStackTrace();}return null;}

(2):使用transferTo (本质上还是使用了流 只不过是封装了步骤)
会生成文件,最后不需要文件要删除

public static void main(String[] args) throws Exception {String path = "F:\\demo\\";File file = new File(path,"demo.txt");// 得到MultipartFile文件MultipartFile multipartFile = getFile();/*byte[] ss = multipartFile.getBytes();OutputStream os = new FileOutputStream(file);os.write(ss);os.close();*/multipartFile.transferTo(file);// 读取文件第一行BufferedReader bufferedReader = new BufferedReader(new FileReader(file));System.out.println(bufferedReader.readLine());// 输出绝对路径System.out.println(file.getAbsolutePath());bufferedReader.close();// 操作完上的文件 需要删除在根目录下生成的文件if (file.delete()){System.out.println("删除成功");}else {System.out.println("删除失败");}}/**** @Description 返回MultipartFile文件* @return org.springframework.web.multipart.MultipartFile* @date 2019/1/5 11:08* @auther dell*/public static MultipartFile getFile() throws IOException {String filePath = "F:\\test.txt";File file = new File(filePath);FileItem fileItem = new DiskFileItem("copyfile.txt", Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());byte[] buffer = new byte[4096];int n;try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){while ( (n = inputStream.read(buffer,0,4096)) != -1){os.write(buffer,0,n);}//也可以用IOUtils.copy(inputStream,os);MultipartFile multipartFile = new CommonsMultipartFile(fileItem);System.out.println(multipartFile.getName());return multipartFile;}catch (IOException e){e.printStackTrace();}return null;}

(3):使用FileUtils.copyInputStreamToFile()
也是会生成文件,到最后也是要删除文件

public static void main(String[] args) throws Exception {String path = "F:\\demo\\";File file = new File(path,"demo.txt");// 得到MultipartFile文件MultipartFile multipartFile = getFile();// 把流输出到文件FileUtils.copyInputStreamToFile(multipartFile.getInputStream(),file);// 读取文件第一行BufferedReader bufferedReader = new BufferedReader(new FileReader(file));System.out.println(bufferedReader.readLine());// 输出绝对路径System.out.println(file.getAbsolutePath());bufferedReader.close();// 操作完上的文件 需要删除在根目录下生成的文件if (file.delete()){System.out.println("删除成功");}else {System.out.println("删除失败");}}/**** @Description 返回MultipartFile文件* @return org.springframework.web.multipart.MultipartFile* @date 2019/1/5 11:08* @auther dell*/public static MultipartFile getFile() throws IOException {String filePath = "F:\\test.txt";File file = new File(filePath);FileItem fileItem = new DiskFileItem("copyfile.txt", Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());byte[] buffer = new byte[4096];int n;try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){while ( (n = inputStream.read(buffer,0,4096)) != -1){os.write(buffer,0,n);}//也可以用IOUtils.copy(inputStream,os);MultipartFile multipartFile = new CommonsMultipartFile(fileItem);System.out.println(multipartFile.getName());return multipartFile;}catch (IOException e){e.printStackTrace();}return null;}

4:强转类型

CommonsMultipartFile commonsmultipartfile = (CommonsMultipartFile) multipartFile;
DiskFileItem diskFileItem = (DiskFileItem) commonsmultipartfile.getFileItem();
File file = diskFileItem.getStoreLocation();

这种强转你获得的file只是一个空壳

你能获取的也只有这个F:\upload_edfce39f_2894_4b66_b865_d5fb8636bdf3_00000000.tmp 网上有说会在根目录生成临时文件的,从tmp也可以看出来是个临时文件,但是我试了好几次啥都没找到。。。。直接获取这个file读取内容也是会报文件找不到的 这是必然的 当然也有在spring配置文件配置CommonsMultipartResolver的 这就感觉很麻烦了。。。。
但是我们可以看一下diskFileItem 看下图 是不是很熟悉了,从diskFileItem可以获取文件流,其实你看了源码你就知道获取文件流都是从这里获取的。剩下的就好办了 我就不赘述了/。

在使用临时文件的时候可以使用缓冲区创建临时文件

//  createTempFile(String prefix, String suffix)
//  prefix 文件名 suffix 文件格式
// 默认是tmp格式  C:\Users\dell\AppData\Local\Temp\tmp8784723057512789016.tmp
File file =File.createTempFile("tmp", null);
// txt格式  C:\Users\dell\AppData\Local\Temp\tmp2888293586594052933.txt
File file =File.createTempFile("tmp", ".txt");

HttpClient构建上传文件参数并实现中转文件

这里不自己给例子了,参考了其他博客的代码

// 获取文件名称
String fileName = file.getOriginalFilename();
HttpPost httpPost = new HttpPost(url);
// 创建文件上传实体
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);
builder.addTextBody("filename", fileName);
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交

执行提交之后你会发现你上传的文件名会出现中文乱码
这里参考
HttpClient上传文件中文名乱码 该博客详细说明了为什么会乱码以及怎么解决
我使用的解决办法是:

 //设置模式为RFC6532builder.setMode(HttpMultipartMode.RFC6532);

MultipartFile与File的一些事相关推荐

  1. SpringBoot:关于MultipartFile和File不得不说的那些事

    https://www.jianshu.com/p/520b1e292c52 最近的项目中需要实现一个上传文件并解析的功能,本来觉得难点在于解析里面10w+的用户数据,但是万万没想到问题出在了一个开始 ...

  2. MultipartFile转为File

    方法一 File file= new File("D:\\filePath"); multipartFile.transferTo(file); 方法二 File file = n ...

  3. MultipartFile和File互转

    MultipartFile和File互转 一.M转F 1.详细方法 /*** 将MultipartFile转换为File*** @param outFilePath 参数* @param multiF ...

  4. MultipartFile 转 File

    作者推荐: import org.apache.commons.io.FileUtils;File file = new File(path);FileUtils.copyInputStreamToF ...

  5. MultipartFile 转File的几种方式

    前言 一.MultipartFile转File 二.代码示例 1.第一种方式 2.第二种方式 3.第三种方式 总结 前言 最近写项目有个需求是上传Excel文件并读取Excel文件中的内容,项目采用的 ...

  6. 将MultipartFile转换为File

    public static File multipartFileToFile(MultipartFile multiFile) {// 获取文件名String fileName = multiFile ...

  7. Spring 之MultipartFile转换File 并鉴别File Mine Type 类型

    常见 MIME 类型列表 扩展名 文档类型 MIME 类型 .aac AAC audio audio/aac .abw AbiWord document application/x-abiword . ...

  8. MultipartFile转File

    前端传过来MultipartFile,后端转为file后删除本地缓存文件 后台接收的需要转换为一个File类型的 接受前端文件: MultipartFile file111 = ((Multipart ...

  9. MultipartFile与File的互转

    MultipartFile与File的互转 前言 MultipartFile转File 1.FileUtils.copyInputStreamToFile转换 2.multipartFile.tran ...

最新文章

  1. sed 替换_Linux中sed的用法
  2. Opencv深拷贝与浅拷贝
  3. Hive之 hive-1.2.1 + hadoop 2.7.4 集群安装
  4. flink scala shell命令行使用示例
  5. C#发送Email邮件(实例:QQ邮箱和Gmail邮箱)
  6. FFmpeg 硬件加速方案概览 (下)
  7. 测试文章测试文章测试文章测试文章测试文章
  8. python requests 10041报错_Python-Requests1-批量登录获取uid
  9. Android中英文单词录入背诵软件
  10. pcb板可挖孔吗_PCB板上的过孔的种类及打孔注意事项
  11. 惠普bios硬重置_惠普BIOS密码重置工具下载_惠普重置BIOS下载 1.66 免费版_当载软件站...
  12. 软件使用-历史足迹-01
  13. Ubutu Mosquitto部署和相关的配置(支持websocket)
  14. SpringSecurity前后端分离02(授权)
  15. 二层交换机VLAN基础配置
  16. Mac打不开别人的.one文件
  17. AWS KVS(Kinesis Video Streams)之WebRTC移植编译(一)
  18. Python数据可视化图表大全
  19. BCS2022|技术峰会:高对抗环境下网络新攻防
  20. 云计算 openstack 云平台搭建详细教程(基于 Vmware 虚拟机搭建)

热门文章

  1. 卸载后以前拍的视频会删除吗_95后不倒翁小姐姐:5天涨粉100万,带火一座长安城!...
  2. 从南到北 我国东部沿海安防产业现状分析
  3. 计算机软件技术主要基础知识,计算机软件技术基础知识点储备.docx
  4. Revit那些让人嫌弃的操作要怎么解决?建模助手统统一键干掉!
  5. 凯立德登陆TD 成为3G手机导航第一人
  6. 程序员如何写好技术简历?
  7. ug10许可证错误一8_网络文化许可证办理常见错误!
  8. pyecharts安装及画2018年中国各省gdp增长地图
  9. 电子制造业如何进行物料编码管理,提高物料管理效率?
  10. 硬盘分区、格式化及文件系统的管理