温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中MultipartFile与File互转如何实现

发布时间:2023-03-14 15:04:49 来源:亿速云 阅读:205 作者:iii 栏目:开发技术

这篇文章主要介绍了Java中MultipartFile与File互转如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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退出时执行删除此路径下的文件

    Java中MultipartFile与File互转如何实现

    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;
        }
    }

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

    Java中MultipartFile与File互转如何实现

    File转MultipartFile

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

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

    Java中MultipartFile与File互转如何实现

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

    Java中MultipartFile与File互转如何实现

    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互转如何实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI