• File 与 MultipartFile概述


    1.MultipartFile 概述
    MultipartFile是SpringMVC提供简化文件流操作的接口,该接口实现类有如下几个
    在这里插入图片描述
    在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据的,如下所示:

    public String fileSave(HttpServletRequest request, HttpServletResponse response){
    	MultipartHttpServletRequest msr = (MultipartHttpServletRequest) request;
        MultipartFile targetFile = msr.getFile("file");
    }
    
    • 1
    • 2
    • 3
    • 4

    此处附上处理文件的一般操作

    // MultipartFile targetFile
    // 文件写入路径 每次写文件的时候要保证 路径唯一 不会发生写入文件覆盖的问题
    String fileName = targetFile.getOriginalFilename();
    LOGGER.info("fileOnlineShowServiceImpl  ==> fileSave() fileName : {}", fileName);
    // 临时将文件存放本地存储位置
    String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName;
    // 将文件写入到本地 localPath
    targetFile.transferTo(new File(tempFilePath));
    LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() tempFilePath : {}", tempFilePath);
    // 将内存的文件上传阿里云OSS,并转换成图片,返回对应的信息
    Map<String, String> fileInfoMaps = fileDealWithService.dealWithFileService(ComonConstant.DIGIT_LONG_ONE, tempFilePath, Boolean.TRUE);
    // 将写入后的数据新增到数据记录表中
    addNewRecorde(fileSaveReqDTO, fileInfoMaps , yhSystemUsers);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    文件是以二进制流传递到后端的,然后需要我们自己转换为File类。使用MultipartFile接口中提供的实现方法,我们对文件处理的操作就会变得很便捷。MultipartFile接口方法如下:

    package org.springframework.web.multipart;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import org.springframework.core.io.InputStreamSource;
    import org.springframework.core.io.Resource;
    import org.springframework.lang.Nullable;
    import org.springframework.util.FileCopyUtils;
    
    public interface MultipartFile extends InputStreamSource {
    	//返回参数的名称
        String getName();
    	// 获取源文件的名称
        @Nullable
        String getOriginalFilename();
    	// 返回文件的内容类型
        @Nullable
        String getContentType();
    	// 判断文件内容是否为空
        boolean isEmpty();
    	// 返回文件大小 以字节为单位
        long getSize();
    	// 将文件内容转化成一个byte[] 返回
        byte[] getBytes() throws IOException;
    	// 返回输入的文件流
        InputStream getInputStream() throws IOException;
    
        default Resource getResource() {
            return new MultipartFileResource(this);
        }
    
        void transferTo(File var1) throws IOException, IllegalStateException;
    	// 将MultipartFile 转换换成 File 写入到指定路径
        default void transferTo(Path dest) throws IOException, IllegalStateException {
            FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    2.MultipartFile 转File
    知悉了MultipartFile 后,我们知道MultipartFile 内部提供了MultipartFile 转File.

    // 临时将文件存放本地存储位置
    String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName;
    // 将文件写入到本地 downloadPath
    targetFile.transferTo(new File(tempFilePath));
    
    • 1
    • 2
    • 3
    • 4

    同时想必大家平时也经常做过类似的处理,常见的如下操作:

    public void writeFileToLocal(MultipartFile targetFile) {
            //开始时间
            LocalDateTime startTime = LocalDateTime.now();
            BufferedInputStream bufferedReader = null;
            BufferedOutputStream bufferedWriter = null;
            try {
                bufferedReader = new BufferedInputStream(targetFile.getInputStream());
                bufferedWriter = new BufferedOutputStream(new FileOutputStream(downloadPath + File.separator +targetFile.getOriginalFilename()));
                int len=0;
                //字节缓冲区
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                while ((len = bufferedReader.read(buffer.array())) != -1) {
                    bufferedWriter.write(buffer.array(),0,len);
                    bufferedWriter.flush();
                }
                LOGGER.info("writeFileToLocal ==> 耗时:" + Duration.between(startTime, LocalDateTime.now()).toMillis());
            } catch (Exception e) {
                LOGGER.info("writeFileToLocal 文件写入失败");
            }finally {
                if (null != bufferedReader) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        LOGGER.info("writeFileToLocal 文件写入失败");
                    }
                }
                if (null != bufferedWriter) {
                    try {
                        bufferedWriter.close();
                    } catch (IOException e) {
                        LOGGER.info("writeFileToLocal 文件写入失败");
                    }
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3.File 转 MultipartFile
    概述中有讲到Spring提供了MultipartFile 接口四个实现类,我们只需将File对象传入到对应实现类的构造方法中,即可实现File 转 MultipartFile,此处提供一个案例如下所示:

    File file = new File(filePath);  // 文件路径
    FileInputStream input = new FileInputStream(file);
    // File 转 MultipartFile
    MultipartFile targetFiles = new MockMultipartFile("targetFiles",file.getName(),null,IOUtils.toByteArray(input));
    String fileName = targetFiles.getOriginalFilename(); // 源文件名
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们经常会去对路径提取文件名,以及文件类型,下面贴出集中lang3提供的常用的方法
    (1).substringAfter

    // 切割文件路径 获取"_"后的文件名
    String textType = "Af_yta_sder.pdf";
    String subRet = StringUtils.substringAfter(textType, "_");
    System.out.println("subRet  = " + subRet );
    
    • 1
    • 2
    • 3
    • 4

    输出结果:

    subRet  = yta_sder.pdf
    
    • 1

    (2).substringAfterLast

    // 获取最后一个"."切割符后的字符串 往往用作获取文件类型
    String textType = "Af_yta_sder.pdf";
    String subRet = StringUtils.substringAfterLast(textType, ".");
    System.out.println("subRet  = " + subRet );
    
    • 1
    • 2
    • 3
    • 4

    输出结果:

    subRet  = pdf
    
    • 1

    (3).substringBefore

    // 获取"."切割符前的字符串 往往用作获取文件名
    String textType = "Af_yta_sder.pdf";
    String subRet = StringUtils.substringBefore(textType, ".");
    System.out.println("subRet  = " + subRet );
    
    • 1
    • 2
    • 3
    • 4

    输出结果:

    subRet  = Af_yta_sder
    
    • 1

    (4).substringBeforeLast

    // 获取最后一个切割符"_"前的字符串
    String textType = "Af_yta_sder.pdf";
    String subRet = StringUtils.substringBeforeLast(textType, "_");
    System.out.println("subRet  = " + subRet );
    
    • 1
    • 2
    • 3
    • 4
    subRet  = Af_yta
    
    • 1

    其他类似的方法大同小异,此处就不一一列举了.

  • 相关阅读:
    PHP:背包问题算法(附完整源码)
    JavaSE之网络编程
    【ESP32_8266_WiFi (十一)】通过JSON实现物联网数据通讯
    java计算机毕业设计销售人员绩效管理系统源程序+mysql+系统+lw文档+远程调试
    (PC+WAP)织梦模板冲压模具类网站
    省去findViewById()方法,kotlin-android-extensions插件
    pdf怎么压缩?pdf文件缩小的方法在这里
    ① MyBatis使用入门,解决IDEA中Mapper映射文件警告。
    对时间强依赖的方法如何做单元测试
    utm 转 经纬度坐标 cesium Ue4 CityEngine
  • 原文地址:https://blog.csdn.net/weixin_44874132/article/details/125471482