MultipartFile与File的一些事

MultipartFile来上传单个及多个文件代码示例 阅读详情
AI摘要

本文详细介绍了Spring框架中MultipartFile与File之间的转换方法,包括使用MockMultipartFile、CommonsMultipartFile进行转换的步骤,以及如何通过流操作实现MultipartFile到File的转换。同时,文章还探讨了在使用HttpClient上传文件时的中文名乱码问题及其解决方案。

前言

前段时间碰到了中转文件的需求,需要使用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();代替while
            byte[] 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的URL
        System.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上传文件中文名乱码
该博客详细说明了为什么会乱码以及怎么解决
我使用的解决办法是:

 //设置模式为RFC6532
 builder.setMode(HttpMultipartMode.RFC6532);
MultipartFile转File,File转MultipartFile 1.MultipartFile转File 阅读详情

相关推荐

Java 文件处理 MultipartFile 与 File 互转

在JavaWeb开发中,MultipartFile和File是处理文件操作的两个关键类。MultipartFile用于接收客户端上传的文件,封装了文件信息和内容;File则代表本地文件系统中的文件或目录,用于文件的读写、删除等操作。实际项目中,常需在两者之间进行转换。MultipartFile转File可通过transferTo方法或流操作实现,通常用于将上传文件保存到本地。File转MultipartFile则可通过MockMultipartFile或自定义实现类完成,适用于文件转发等场景。这些转换在文件

wjianwei666的专栏 933

MultipartFile工具类(方法详解)

本篇案例学习MultipartFile工具类,案例超详细,深入浅出学习相关知识点!

末尾卡片和博主交流学习! 12万+

SpringMVC使用MultipartFile实现文件上传

主要为大家详细介绍了SpringMVC使用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

MultipartFile详解

为org.springframework.web.mutipart包下的一个类,也就是说如果想使用MultipartFile这个类就必须引入spring框架换句话说,如果想在项目中使用MultipartFile这个类,那么项目必须要使用spring框架才可以,否则无法引入这个类。MultipartFile翻译成中文来讲就是“多组件的文档”,不用太在乎他的中文含义,一般来讲使用MultipartFile这个类主要是来实现以表单的形式进行文件上传功能。

Sunny_yaa的博客 1万+

别再死记硬背了!用‘瞬时极性法’5分钟搞定三极管反馈电路类型判断

本文介绍了使用‘瞬时极性法’快速判断三极管反馈电路类型的高效技巧。通过假设输入信号变化并追踪传递路径,该方法能准确区分正负反馈、电压电流反馈、串联并联反馈及交直流反馈,避免传统死记硬背的弊端,显著提升电路分析效率。

weixin_42524708的博客 181

自抗扰控制ADRC原理解析及案例应用

ESO的设计通常基于系统动态方程的线性化或近似模型,其输出包括系统状态的估计值和总扰动的估计值。非线性状态误差反馈控制律(Nonlinear State Error Feedback,NLSEF)是ADRC的最后一个环节,负责根据ESO和TD提供的信息生成控制信号。ADRC的另一个重要发展方向是与其他控制策略的融合,如模糊控制、神经网络和自适应控制等,以进一步提高系统的鲁棒性和适应性。ADRC的参数主要包括扩张状态观测器(ESO)的参数和非线性状态误差反馈控制律(NLSEF)的参数。

LIUMAO99的博客 9277

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

https://www.jianshu.com/p/520b1e292c52 最近的项目中需要实现一个上传文件并解析的功能,本来觉得难点在于解析里面10w+的用户数据,但是万万没想到问题出在了一个开始的接收参数上面。 在项目中我们使用MultipartFile来接收postman传过来的文件,然而后面又需要将文件写入InputStreamReader,进而逐行读取文件内容并写入list...

xxxcyzyy的博客 7662

论文分享 - OctoMap八叉树建图原理

论文:OctoMap:An Efficient Probabilistic 3D Mapping Framework Based on Octrees。

一只废佐_的博客 2539

MultipartFile转File

前端传过来MultipartFile,后端转为file后删除本地缓存文件 后台接收的需要转换为一个File类型的 接受前端文件: MultipartFile file111 = ((MultipartHttpServletRequest) httpServletRequest).getFile("前端传得文件名"); 转换: package com.hswg.jstxb.issued...

唐僧洗发用飘柔 10万+

Axure rp9 中继器新建表格

Axure rp9 中继器新建表格

weixin_49295490的博客 1652

PCL 点云加权均值收缩

PCL 点云加权均值收缩

dayuhaitang1的博客 688

MultipartFile的属性 file.getOriginalFilename()与file.getName()的区别 MultipartFile与File互转

二、MultipartFile常用方法 三、Springboot与MultipartFile的使用 3.1 设置文件上传大小限制 3.2 Springboot上传单个文件,包含其他参数 3.3 Springboot上传多个文件,包含请求体 四、MultipartFile中transferTo方法的坑 4.1 调用tansferTo()方法后,再次获取file.getInputStream()方法时,报临时文件异常 源码分析 五、MultipartFile与File文件互转

weixin_49114503的博客 2万+

8.26华为OD机试真题 新系统【仓库查询】

华为OD机试真题 新系统【仓库查询】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓库查询】多语言题解。

qq_45776114的博客 541

File 与 MultipartFile概述

FIle与MultipartFile概述

weixin_44874132的博客 3万+

2026 MCM Problem A:智能手机电池连续时间建模——完整解题思路附第一问解题代码

摘要:本文针对2026年MCM A题"智能手机电池连续时间建模"问题,提出基于能量守恒原理的微分方程模型。通过建立以SOC(t)为状态变量的动态系统,将屏幕亮度、处理器负载等主要耗电因素纳入统一功率框架,实现了不同使用场景下的电量变化精确描述。研究表明,屏幕亮度和CPU负载对续航时间影响最大,温度与后台任务会产生放大效应。该模型具有物理可解释性和应用扩展性,为手机电源管理提供了理论依据。(150字)

一键难忘的博客 767

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 403

Byte、File、MultipartFile之间的转换

一、byte[]转MultipartFile 需要引入jar包才能使用 pom.xml(版本可自行指定) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-mock</artifactId> <version>2.0.8</version> </dependency> MockMultipartF

weixin_40300139的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MultipartFile与File

前言 前段时间碰到了中转文件的需求,需要使用HttpClient中转一下文件,过程为: 在实现这个需求的过程中就用得到了MultipartFile与File,而且我对前一个也不是很熟悉。记录一下 什么是MultipartFile MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。【来自百度知道】 Multipart...

sunny潘先生的博客 7248

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MultipartFile与File的互转

需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用FormData表单的方式请求后台,后台接收类型是MultipartFile,放置文件过大时会造成内存溢出需要转换为File类型。

后端开发 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

File与MultipartFile互转

File file = new File(filePath+fileName); FileInputStream fileInputStream = new FileInputStream(file); String[] fileNameSplit = fileName.split("\\."); MultipartFile multipartFile = new MockMultipartFil...

可乐止饱 2547

关于MultipartFile与File如何进行转换

文章目录File转MultipartFileMultipartFile转File File转MultipartFile package edp; import org.apache.poi.util.IOUtils; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.i

希冀 5342
上一篇: 【JAVA】图片与BASE64互相转换
下一篇: 【前端开发】前端开发效率工具集合
sdut菜鸟
博客等级 码龄11年 231粉丝 126原创
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值