一文彻底弄懂Java中MultipartFile接口和File类

 更新时间:2023年11月20日 15:33:15   作者:荔枝当大佬  
MultipartFile是一个接口,我们可以理解为是Spring 给我们绑定的一个在使用文件上传等时简便实现的口子,这篇文章主要给大家介绍了关于如何通过一文彻底弄懂Java中MultipartFile接口和File类的相关资料,需要的朋友可以参考下

一、File类

java.io.File是 Java 标准库中用于操作文件和目录路径的类。它提供了很多方法,用于创建、删除、重命名、判断文件是否存在、获取文件信息等操作。

获取文件信息

  • boolean exists(): 判断文件或目录是否存在。
  • boolean isFile(): 判断是否是文件。
  • boolean isDirectory(): 判断是否是目录。
  • String getName(): 获取文件或目录的名称。
  • String getPath(): 获取文件或目录的路径。
  • String getAbsolutePath(): 获取文件或目录的绝对路径。
  • long length(): 获取文件的大小(字节数)。

文件和目录操作

  • boolean createNewFile(): 创建新文件。如果文件已存在,则不创建,返回 false
  • boolean mkdir(): 创建新目录。如果目录已存在,则不创建,返回 false
  • boolean mkdirs(): 创建新目录及其父目录,如果不存在的话。
  • boolean delete(): 删除文件或目录。

文件路径操作

  • boolean renameTo(File dest): 重命名文件或目录。如果成功,返回 true;否则,返回 false
  • String[] list(): 返回目录下的文件和目录名数组。
  • File[] listFiles(): 返回目录下的文件和目录的 File 对象数组。

文件过滤

  • String[] list(FilenameFilter filter): 返回目录下满足指定过滤器条件的文件和目录名数组。
  • File[] listFiles(FileFilter filter): 返回目录下满足指定过滤器条件的文件和目录的 File 对象数组。

二、MultipartFile接口

MultipartFile是 Spring 框架提供的一个接口,用于表示处理文件上传的对象。它通常用于处理multipart/form-data类型的请求,例如处理文件上传的表单。首先我们依旧可以通过源码的学习来进一步了解这个接口。

2.1 源码和方法功能 

public interface MultipartFile extends InputStreamSource {
    String getName();

    @Nullable
    String getOriginalFilename();

    @Nullable
    String getContentType();

    boolean isEmpty();

    long getSize();

    byte[] getBytes() throws IOException;

    InputStream getInputStream() throws IOException;

    default Resource getResource() {
        return new MultipartFileResource(this);
    }

    void transferTo(File dest) throws IOException, IllegalStateException;

    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}
  • String getName():获取上传文件的表单字段名称
  • String getOriginalFilename():获取上传文件的原始文件名
  • String getContentType():获取上传文件的内容类型
  • boolean isEmpty():判断上传文件是否为空
  • long getSize():获取上传文件的大小,单位是字节
  • byte[] getBytes() throws IOException:获取上传文件的字节数组表示
  • InputStream getInputStream() throws IOException:获取上传文件的输入流
  • default Resource getResource() :将 MultipartFile 封装成了 Resource 对象,从而可以使用 Resource 接口提供的方法来操作上传文件的内容。
  • void transferTo(File dest) throws IOException, IllegalStateException:将上传文件保存到指定的文件;
  • default void transferTo(Path dest) throws IOException, IllegalStateException :将上传文件保存在指定的路径下;

2.2 void transferTo(File dest)

前面我们已经介绍了该方法是Spring中提供的将上传文件保存到指定的文件中的抽象方法,溯源源码我们可以看到这个接口方法被三个实现类实现了,分别是CommonsMultipartFile、MockMultipartFile 和 StandardMultipartHttpServletRequest。

CommonsMultipartFile中的方法体

我们可以看到CommonsMultipartFile中的方法体主要是通过检测传进来的文件是否可用、是否存在,并在检测完成就执行写入的操作

public void transferTo(File dest) throws IOException, IllegalStateException {
        if (!this.isAvailable()) {
            throw new IllegalStateException("File has already been moved - cannot be transferred again");
        } else if (dest.exists() && !dest.delete()) {
            throw new IOException("Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");
        } else {
            try {
                this.fileItem.write(dest);
                LogFormatUtils.traceDebug(logger, (traceOn) -> {
                    String action = "transferred";
                    if (!this.fileItem.isInMemory()) {
                        action = this.isAvailable() ? "copied" : "moved";
                    }

                    return "Part '" + this.getName() + "',  filename '" + this.getOriginalFilename() + "'" + (traceOn ? ", stored " + this.getStorageDescription() : "") + ": " + action + " to [" + dest.getAbsolutePath() + "]";
                });
            } catch (FileUploadException var3) {
                throw new IllegalStateException(var3.getMessage(), var3);
            } catch (IOException | IllegalStateException var4) {
                throw var4;
            } catch (Exception var5) {
                throw new IOException("File transfer failed", var5);
            }
        }
    }

上面这段demo中可能对于this.isAvailable()有疑问,我们知晓这里的this其实是该类的实例化对象,但是这里的this.isAvailable()就是拿来判断目的文件是否可用,调用的就是类的内部方法,判断是否可用的条件就是该目标文件是否被加载进内存中

这里给出一个使用该方法的例子,需要注意的是这时候方法要求的是一个目标File对象,我们需要在调用该目标方法的时候就根据目标路径创建了目标的File对象。

// 获取上传文件的原始文件名
String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());

// 构建目标文件对象
File destFile = new File("/path/to/destination/directory", originalFilename);

try {
    // 将上传文件保存到目标文件
    file.transferTo(destFile);
    return "File uploaded successfully!";
} catch (IOException e) {
    e.printStackTrace();
    return "Failed to upload the file.";
}

StandardMultipartHttpServletRequest实现类 

而另一个实现类StandardMultipartHttpServletRequest和CommonsMultipartFile的区别就在于使用StandardMultipartHttpServletRequest直接上传文件的话可能会出现目录跳跃的问题,而CommonsMultipartFile不会,这是因为其对路劲分隔符了相关的限制,具体的部分大家可以看看这篇博客:https://www.jb51.net/program/3053831or.htm 而MockMultipartFile这个实现类就更简单了,做了简单的输入输出流的copy,这里就不再水字数了。

2.3 default void transferTo(Path dest)

该默认方法在实现类中被重写了,但主要的功能还是不变,就是将上传的文件写入到指定路径的Path对象中实现文件上传的功能。 

这里给出使用的示例代码:

// 构建目标文件路径
String uploadDirectory = "/path/to/destination/directory";
String originalFilename = file.getOriginalFilename();
Path filePath = Paths.get(uploadDirectory, originalFilename);

try {
// 将上传文件保存到目标文件
    file.transferTo(filePath);
    return "File uploaded successfully!";
} catch (IOException e) {
    e.printStackTrace();
    return "Failed to upload the file.";
}

总结

这篇文章主要围绕MultipartFile接口和File类中相关方法的功能进行梳理,其中有关文件写入File对象和Path对象重点进行了剖析,而具体的有关文件管理的部分知识大家可以关注后续荔枝梳理的有关SpringBoot整合MinIO的博客和后续的博文输出。

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

相关文章

  • java清除u盘内存卡里的垃圾文件示例

    java清除u盘内存卡里的垃圾文件示例

    手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个文件占用了内存太大了
    2014-02-02
  • Java实现SHA-256加密算法的完全解析

    Java实现SHA-256加密算法的完全解析

    SHA-256是一种散列(哈希)算法,用于将任意长度的数据映射为固定长度的散列值,以保证数据完整性。本文将为大家介绍一下SHA-256加密算法的原理与实现,希望对大家有所帮助
    2023-02-02
  • java 打印一字符串,并在main()方法内调用它

    java 打印一字符串,并在main()方法内调用它

    编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。
    2017-02-02
  • springboot中如何引入AOP切面编程

    springboot中如何引入AOP切面编程

    这篇文章主要介绍了springboot中如何引入AOP切面编程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • IDEA如何设置SVN提交忽略文件 target.iml

    IDEA如何设置SVN提交忽略文件 target.iml

    使用IDEA的SVN插件时,可能会遇到提交不必要文件的问题,解决这个问题有两种方法:第一种是在IDEA设置中的File Types下的Ignore files and folders添加需要忽略的文件或文件夹;第二种是使用SVN客户端TortoiseSVN,在项目目录点击右键选择properties
    2024-10-10
  • Java经典排序算法之希尔排序详解

    Java经典排序算法之希尔排序详解

    这篇文章主要为大家详细介绍了Java经典排序算法之希尔排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • java使用ant.jar解压缩文件的示例代码

    java使用ant.jar解压缩文件的示例代码

    这篇文章主要介绍了java使用ant.jar解压缩文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • mybatis plus 关联数据库排除不必要字段方式

    mybatis plus 关联数据库排除不必要字段方式

    这篇文章主要介绍了mybatis plus 关联数据库排除不必要字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringMVC 中的视图使用 JSP的过程

    SpringMVC 中的视图使用 JSP的过程

    本文介绍了如何在 SpringMVC 中使用 JSP 视图,包括如何创建 JSP 视图、配置 JSP 视图解析器、以及如何在控制器方法中使用JSP视图,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-07-07
  • 一文搞懂java中的栈和括号匹配

    一文搞懂java中的栈和括号匹配

    栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的栈 和 StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)
    2023-11-11

最新评论