Java中MultipartFile与File互转的实现

 更新时间:2023年03月14日 10:52:37   作者:周全全  
本文主要介绍了Java中MultipartFile与File互转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

MultipartFile转File

其实转换的本质都是要创建一个file的临时文件,然后通过各种实现方式将MultipartFile中的内容写入到file中

1.FileUtils.copyInputStreamToFile转换

package com.cxstar.file.util;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {


    /**
     * MultipartFile转File
     * <p>
     * 项目根路径创建临时文件,转换得到File,再删除临时文件
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //根目录下生成临时文件
        File file = new File(tempDir+File.separator+originalFilename);

        FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);

        return file;
    }

}

此种方式的弊端就是需要在调用此方法后需要再手动删除,也就是要在业务代码中再掺杂删除的逻辑。

2.multipartFile.transferTo(tempFile);

/**
     * MultipartFile转File
     * <p>
     * 项目根路径创建缓冲区来实现这个转换
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //获取文件名
        String filename = StringUtils.substringBeforeLast(originalFilename, ".");
        //获取文件后缀
        String fileExt = StringUtils.substringAfterLast(originalFilename, ".");

        //在项目根路径生成临时文件
        File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));

        multipartFile.transferTo(tempFile);

        //在jvm退出时执行删除此路径下的文件
        tempFile.deleteOnExit();

        return tempFile;
    }

注意:
1.防止生成的临时文件,createTempFile()方法会在文件名后添加随机码
2.生成的文件不会立马删除,而是在jvm退出时执行删除此路径下的文件

在这里插入图片描述

3. (推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());

package com.cxstar.file.util;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {
    /**
     * MultipartFile 转 File
     *
     * @param multipartFile
     * @throws Exception
     */
    public static File multiPartFileToFile3(MultipartFile multipartFile) {
        File file = null;
        if (multipartFile.isEmpty()) {
            return null;
        }

        try {
            //本质上还是在项目根路径创建文件
            file = new File(multipartFile.getOriginalFilename());

            //将MultipartFile的byte[]写入到file中
            FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}

此种方式相较于第二种方式,文件名不会发生改变,当然还是要手动删除

在这里插入图片描述

File转MultipartFile

MultipartFile文件上传时,其实springmvc已经转为StandardMultipartFile子类型

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile

在这里插入图片描述

MultipartFile是一个接口,因此转成MultipartFile格式需要转成实现MultipartFile接口的实现类即可

在这里插入图片描述

package com.cxstar.file.util;

import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {
    public static MultipartFile getMultipartFile(File file) throws Exception {
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
        return multipartFile;
}

 到此这篇关于Java中MultipartFile与File互转的实现的文章就介绍到这了,更多相关Java MultipartFile与File互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何读取json文件

    Python如何读取json文件

    这篇文章主要介绍了Python如何读取json文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 利用python批量检查网站的可用性

    利用python批量检查网站的可用性

    当大家的站点越来越来越多的时候会发现管理起来也挺复杂的,所以这篇文章给大家分享下利用python批量检查网站的可用性的功能,对大家管理网站具有很实用的价值,有需要的朋友可以参考借鉴。
    2016-09-09
  • 教你怎么用Python处理excel实现自动化办公

    教你怎么用Python处理excel实现自动化办公

    这篇文章主要介绍了教你怎么用Python处理excel实现自动化办公,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • python利用装饰器进行运算的实例分析

    python利用装饰器进行运算的实例分析

    本文主要是通过使用Python的装饰器来做一个运算的实例,来给大家详细介绍下Python的装饰器,非常的实用,有需要的小伙伴可以参考下。
    2015-08-08
  • Python使用指定字符长度切分数据示例

    Python使用指定字符长度切分数据示例

    今天小编就为大家分享一篇Python使用指定字符长度切分数据示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统

    Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统

    这篇文章主要介绍了Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • selenium获取元素定位的方法总结(动态获取元素)

    selenium获取元素定位的方法总结(动态获取元素)

    要想操作一个元素,首先应该识别这个元素,人有各种的特征(属性),可以通过其特征找到人,同理,界面的某个元素会有各种的特征(属性),可以通过这个属性找到这对象,本文给大家介绍了python selenium获取元素定位的8种方法,需要的朋友可以参考下
    2024-02-02
  • Pycharm添加虚拟解释器报错问题解决方案

    Pycharm添加虚拟解释器报错问题解决方案

    这篇文章主要介绍了Pycharm添加虚拟解释器报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • python raise的基本使用

    python raise的基本使用

    这篇文章主要介绍了python raise的基本使用,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • python中将正则过滤的内容输出写入到文件中的实例

    python中将正则过滤的内容输出写入到文件中的实例

    今天小编就为大家分享一篇python中将正则过滤的内容输出写入到文件中的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论