关于File与MultipartFile的用法概述

 更新时间:2023年09月22日 09:32:40   作者:叶枫^_^  
这篇文章主要介绍了关于File与MultipartFile的用法概述,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.MultipartFile 概述

MultipartFile是SpringMVC提供简化文件流操作的接口,该接口实现类有如下几个

在这里插入图片描述

在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据的,如下所示:

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

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

// 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);

文件是以二进制流传递到后端的,然后需要我们自己转换为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));
    }
}

2.MultipartFile 转File

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

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

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

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 文件写入失败");
                }
            }
        }
    }

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(); // 源文件名

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

(1).substringAfter

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

输出结果:

subRet  = yta_sder.pdf

(2).substringAfterLast

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

输出结果:

subRet  = pdf

(3).substringBefore

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

输出结果:

subRet  = Af_yta_sder

(4).substringBeforeLast

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

subRet  = Af_yta

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA使用properties配置文件进行mysql数据库连接的教程图解

    IDEA使用properties配置文件进行mysql数据库连接的教程图解

    Properties类是 键和值均为字符串的可以永久存储到文件中的key-value集合。这篇文章主要介绍了IDEA使用properties配置文件进行mysql数据路连接 ,需要的朋友可以参考下
    2018-10-10
  • idea设置在包里面在创建一个包方式

    idea设置在包里面在创建一个包方式

    这篇文章主要介绍了idea设置在包里面在创建一个包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot整合Liquibase的示例代码

    SpringBoot整合Liquibase的示例代码

    本篇文章给大家介绍SpringBoot整合Liquibase的两种情况分析,看似整合问题很简单,但是很容易出错,下面小编给大家介绍下整合步骤,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Spring Data MongoDB的核心用法 附示例代码

    Spring Data MongoDB的核心用法 附示例代码

    本文将系统梳理Spring Data MongoDB 的核心用法,涵盖实体类注解、增删改查、条件查询、分页排序等常见场景,并提供可直接复用的代码示例,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • 显示SonarQube私有项目徽章方案流程

    显示SonarQube私有项目徽章方案流程

    这篇文章主要为大家介绍了如何显示SonarQube私有项目徽章方案的流程,sonarQube目前不支持私有项目的徽章图片获取,这个问题早在 2018年就在sonar社区里有过激烈的讨论,至今无果,只能自己寻求一种可以快速实施的方案
    2022-02-02
  • Java+OpenCV调用摄像头实现拍照功能

    Java+OpenCV调用摄像头实现拍照功能

    随着我们对环境、Mat基本使用越来越熟练、Java Swing也逐步熟悉了起来。本文将通过OpenCV驱动摄像头实现识脸和拍照功能,需要的可以参考一下
    2022-03-03
  • 手把手教你如何在idea中搭建SpringBoot项目

    手把手教你如何在idea中搭建SpringBoot项目

    这篇文章主要介绍了如何搭建一个SpringBoot项目,包括环境准备、创建新项目、探索项目结构以及展望未来,通过详细的步骤和实用的技巧,帮助开发者快速上手SpringBoot开发,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • 深入理解Java中的注解Annotation

    深入理解Java中的注解Annotation

    这篇文章主要介绍了深入理解Java中的注解Annotation,注解在Java中确实也很常见,但是人们常常不会自己定义一个注解拿来用,我们虽然很少去自定义注解,但是学会注解的写法,注解的定义,学会利用反射解析注解中的信息,在开发中能够使用到,这是很关键的,需要的朋友可以参考下
    2023-10-10
  • SpringSecurity 用户帐号已被锁定的问题及解决方法

    SpringSecurity 用户帐号已被锁定的问题及解决方法

    这篇文章主要介绍了SpringSecurity 用户帐号已被锁定,本文给大家分享问题原因及解决方式,需要的朋友可以参考下
    2023-12-12
  • java JDBC系列教程之JDBC类的简析与JDBC的基础操作

    java JDBC系列教程之JDBC类的简析与JDBC的基础操作

    这篇文章主要介绍了java JDBC系列教程之JDBC类的简析与JDBC的基础操作,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论