Springboot 文件上传

        文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。

        文件上传前端需要完成的准备:
         需要提交一个form表单,表单必须包含以下三点(上传文件页面三要素)
         1.必须具有file域,file域是用于选择需要上传的文件 <input type="file" name="image"/>
         2.表单的提交方式必须为post --因为通常上传的文件相对较大,所以说需要使用post的方式提交
         3.表单的编码类型enctype必须为:multipart/form-data
         因为默认的编码格式是不适合传输大型的二进制文件的----假如说使用默认的编码,传输的并不是文件的内容,而是文件名
         所以说在文件上传的时候enctype的编码必须设置为multipart/form-data,这样才可以正确的传输文件到服务端


         文件上传后端需要完成的准备:
         1.先在服务端定义一个controller用于文件上传,然后在controller中定义一个方法处理/upload请求
         2.在定义的方法中接收提交过来的数据(方法中的形参名和请求参数的名字保持一致)----Spring中提供了一个API:MultipartFile
         这个API可以用来接收上传的文件。MultiPartFile需要定义在方法的参数列表中,并且其实体类名必须和前端file域的名字相同

         若表单项的名字和方法中的形参名不一样怎么办?
         可以使用@RequestParam注解进行参数绑定(虽然可以完成需求,但是建议将二者的名字写成一样的)

        UploadController

package com.wzb.UploadController20241008;

import com.wzb.pojo20241008.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
public class UploadController {

//    @PostMapping("/upload")
//    public Result upload(String userName, Integer age, MultipartFile image) {
//        // Spring提供的上传文件的API:MultipartFile必须在方法参数中声明,并且实体类名必须和表单名相同
//        System.out.println("文件上传");
//        return Result.success();
//
//    }

    // 文件若只是单纯的上传,不做处理,那么在文件上传之后,会将表单提交的数据分别存储在不同的临时文件中(.tmp),当
    // 程序运行完毕之后,.tmp临时文件将自动删除,这不符合文件上传的需求,也许需要将文件本地存储

//     将前端页面上传的文件在服务器本地存储
//     1.在服务器本地磁盘中创建一个目录,用于存储上传的文件
//     2.使用MultipartFile中的方法,将临时文件转存到本地磁盘的目录下
//     -- MultipartFile的常见方法
//          String getOriginalFilename() 获取原始的文件名
//          void transferTo(File dest) 将接收的文件转存到本地磁盘的指定位置
//          long getSize() 获取文件的大小 单位:字节
//          byte[] getBytes() 获取文件内容的字节数组
//          InputStream getInputStream() 获取接收到的文件内容的输入流

//    @PostMapping("/upload")
//    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
//        System.out.println("文件上传测试");
//        // 获取原始的文件名
//        String originalFileName = image.getOriginalFilename();
//        // 将文件存储在服务器的本地磁盘目录
//        image.transferTo(new File("E:/images/" + originalFileName));
//        // 响应结果
//        return Result.success();
//    }
    // 发现成功上传了一个文件,并且能够成功的保存在服务器的本地,但是存在一个问题————上传单个文件是没有问题的,但是
    // 若上传了多个文件,存在同名的文件,那么后上传的文件就会将本地已经存在的文件覆盖掉,这不符合需求


    // 解决上传同名文件的文件覆盖问题:保证每次上传文件时,文件名都是唯一的(使用UUID获取随机的文件名)
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
        System.out.println("文件上传");
        // 获取原始文件名————此处获取原始文件名只是为了获得文件的类型
        String originalFileName = image.getOriginalFilename();
        // 通过UUID构建新的文件名:随机的UUID作为文件名,通过原始文件名得到文件类型,二者拼接可以得到新的文件名
        String externalName = ".txt"; // 默认是文本文档
        if (originalFileName != null) {
            externalName = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 这个substring截取的意思是,从最后一个.开始截取,所以说这就是文件扩展名
        }
        String newFileName = UUID.randomUUID().toString() + externalName;
        // 将UUID为文件名的文件存储到服务器的磁盘目录
        image.transferTo(new File("E:/images/" + newFileName));
        // 响应
        return Result.success();
    }
    // 使用UUID改造文件名可以成功解决文件名重复替代的问题,但是发现上传一个较大的文件时(超过1M),后端程序报错
    // 原因:SpringBoot中,配置了文件上传时单个文件最大大小是1M
    // 想要上传大文件,需要在application.properties中进行配置

    // 本地存储到此处就完成了,但是将上传的文件存储到服务器本地是不会使用的
    // 1.在服务器本地存储的资源不能直接访问
    // 2.服务器磁盘资源珍贵,不适合存储大量无用的文件
    // 3.服务器集群方式,不方便扩容,磁盘满了难以扩容
    // 4.磁盘坏了就直接寄

    // 所以说为了解决文件本地存储的问题,可以使用云存储
}

        Result响应结果类

package com.wzb.pojo20241008;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code; // 响应码,1是响应成功,2是响应失败
    private String message; // 响应信息,描述响应结果的字符串
    private Object data; // 响应返回的数据

    // 响应成功,但不返回数据的方法
    public static Result success() {
        return new Result(1, "success", null);
    }
    // 响应成功,并且返回数据的方法
    public static Result success(Object data) {
        return new Result(1,"success", data);
    }
    // 响应失败的方法
    public static Result fail(String message) {
        return new Result(0, message, null);
    }
}

 

Spring Boot中实现文件上传非常简单。首先,你需要在项目的依赖中添加spring-boot-starter-web。然后,你可以通过配置文件来对文件上传进行一些基本的配置。例如,你可以设置是否开启文件上传支持、文件写入磁盘的阈值、上传文件的临时保存位置、上传的单个文件的最大大小以及多文件上传时文件的总大小等。\[1\] 对于单文件上传,你可以创建一个HTML表单,使用enctype="multipart/form-data"来指定表单的编码类型,并使用<input type="file">来选择文件。然后,你可以在后端编写一个处理文件上传的接口,通过@RequestParam注解来获取上传的文件。\[2\] 对于多文件上传,你可以创建一个HTML表单,使用相同的方式来选择多个文件。然后,你可以在后端编写一个处理多文件上传的接口,通过@RequestParam注解来获取上传的文件列表。\[2\] 在Spring Boot中,如果你没有提供MultipartResolver,那么默认采用的MultipartResolver就是StandardServletMultipartResolver。因此,你甚至可以实现零配置的文件上传。\[3\] 总结起来,Spring Boot提供了简单而强大的功能来实现文件上传,你只需要添加依赖、进行一些基本的配置,然后在后端编写相应的接口即可实现文件上传功能。 #### 引用[.reference_title] - *1* *2* *3* [SpringBoot文件上传](https://blog.csdn.net/qq_43581790/article/details/123811775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值