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

这篇具有很好参考价值的文章主要介绍了彻底弄懂Java中的MultipartFile接口和File类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        不管是在项目中还是日常需求,我们总是有操作文件数据的需求,Java中操作文件不可避免就要使用File类,而Spring中为我们提供了一个操作文件的接口,通过该接口我们可以获取用户上传的文件对象并写入文件系统中。


文章目录

前言

一、File类

二、MultipartFile接口

2.1 源码和方法功能 

2.2 void transferTo(File dest)

CommonsMultipartFile中的方法体

StandardMultipartHttpServletRequest实现类 

 2.3 default void transferTo(Path dest)

总结


一、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()就是拿来判断目的文件是否可用,调用的就是类的内部方法,判断是否可用的条件就是该目标文件是否被加载进内存中

java multipartfile,Java开发,java,前端,后端,MultipartFile

这里给出一个使用该方法的例子,需要注意的是这时候方法要求的是一个目标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.cnblogs.com/zpchcbd/p/17148291.html 而MockMultipartFile这个实现类就更简单了,做了简单的输入输出流的copy,这里就不再水字数了。

java multipartfile,Java开发,java,前端,后端,MultipartFile

 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的博客和后续的博文输出。希望能帮助到有需要的小伙伴~~~

今朝已然成为过去,明日依然向往未来!我是荔枝,在技术成长之路上与您相伴~~~

如果博文对您有帮助的话,可以给荔枝一键三连嘿,您的支持和鼓励是荔枝最大的动力!

如果博文内容有误,也欢迎各位大佬在下方评论区批评指正!!!文章来源地址https://www.toymoban.com/news/detail-757947.html

到了这里,关于彻底弄懂Java中的MultipartFile接口和File类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring: MultipartFile和File的区别

    MultipartFile 和 File 是用于处理文件上传的两种不同类型,主要在不同的编程环墨境中使用。 File 是 Java 标准库中的类,用于表示文件或目录的抽象路径名。 它通常用于在 Java 程序中对本地文件系统中的文件进行操作,比如创建文件、读取文件内容、删除文件等。 File 类并不直

    2024年02月21日
    浏览(34)
  • Springboot获取文件内容,将MultipartFile转File方法

    文件上传以前是噩梦一样的存在,觉得很少麻烦,后来仔细研究后发现通过前端传文件去调取后端接口并不是特别复杂,接下来我详细说一下通过接口的方式接收前端传过来的文件,并且解析文件中内容的方法 话不多说,开整代码 剩下的写业务层,就不多谢业务了,主要写

    2024年02月02日
    浏览(50)
  • Postman本地测试上传MultipartFile文件接口

    在请求Body中选择form-data传输类型,填写后端file参数名称,并将参数设置为File类型,这时value输入框将变成文件选择框。 如果此时发送请求给后端,会返回报错request is not a multipart request. 我们还需要将数据传输类型Content-Type设置为multipart/form-data.

    2024年02月12日
    浏览(57)
  • 后端接收文件类型的接口(MultipartFile)接收

    使用java,springboot接收 MultipartFile文件类型的接口 file一般接口中使用MultipartFile类型接收 Controller层:参数编写 思路:以.json文件举例 先将MultipartFile转化为file格式,然后再将file格式文件通过流进行解析成string 直接上转化的代码 获取到json字符串之后,通过JSONObject将json转化为

    2024年01月15日
    浏览(41)
  • java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端

    文件上传项目可参考:点击预览 1.最简单也是最普遍的做法是form表单提交,其实前端提交到后端也是难以离开form表单提交, 一般有两种方式来处理文件、图片上传: 先上传,获取返回路径,再整个表单提交后端保存; 普通数据与文件图片同时提交后端,由后端处理 优点比

    2024年02月03日
    浏览(55)
  • 一篇文章带你彻底弄懂Java的==符号

    本篇文章6735字,大概阅读时间20分钟。本文中使用到的JDK版本为1.8.0_301 目录 ==符号的定义 基本类型中==符号的判断 String类型中==符号的判断         在Java中==符号的作用分为两类:         1:==符号在八种基本类型的作用是比较对应基本类型的 数值是否相等         2:

    2024年02月08日
    浏览(55)
  • 【Java】一文彻底弄懂访问修饰符(public/protected/默认/private)--建议收藏

    博主简介: 努力学习的预备程序媛一枚~ 博主主页: @是瑶瑶子啦 所属专栏: Java岛冒险记【从小白到大佬之路】  OOP(Object Oriented Programing),即面向对象编程,最重要的功能/特点之一就是 封装 ,这点在该专栏开篇博客【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

    2024年02月22日
    浏览(49)
  • MultipartFile实现文件上传功能

    MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。在文件上传这方面能帮助我们快速简洁实现。 1、yml配置文件 2、API介绍 3、文件上传示例 注意: @RequestPart(\\\"file\\\") 主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,

    2024年02月16日
    浏览(52)
  • Feign传递文件以及MultipartFile对象

    使用spring接收文件可以使用 MultipartFile 对象,并同时使用 RequestPart 注解标识这个一个多媒体参数。 也就是request的 content-Type=multipart/form-data 文件上传provider代码: 同时你可以可以还接收其他参数,例如: 或者这种形式 测试服务提供者 首先要保证服务提供者能够正常接收多媒

    2024年02月04日
    浏览(38)
  • 传json的同时传递多个MultipartFile

    1,Java后端代码:(注意 @RequestPart 注解的使用哦!) 2,Postman测试时的传参: 备注: 如果除文件外都是 query 类型的参数的话,就不需要在除文件参数外的其他地方加任何注解,依旧按照老方法传递即可

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包