Spring Boot文件上传功能的实现!超详细!

06-01 1028阅读

前言:

        文件上传功能在很多系统中都占据非常重要的份置,软件开发人员在实现文件上传时,除了需要确保程序代码的稳健性和高维护性外,还需要从社会责任的角度审的需求,秉承合法、合规的职业理念进行数据读写,避免程序在保存用户上传的文件时造成不良的社会影响。例如,应该关注保护用户的隐私,避免用户的隐私泄露,以及杜绝上传非法文件。

项目目录:

Spring Boot文件上传功能的实现!超详细!

一、设置上传配置

        在项目的application.yml文件中对静态资源的映射和文件上传进行配置,具体代码如下:

spring:
  mvc:
    static-path-pattern: /backend/**
    # 配置Spring MVC静态资源的路径模式,表示所有以"/backend/"开头的请求都将被视为静态资源请求
  web:
    resources:
      static-locations:               # 配置静态资源的位置列表,可以包含多个位置
        - file:E:/Chapter01/src/main/resources/backend/
        # 指定一个外部文件系统目录作为静态资源的位置
  servlet:
    multipart:
      max-file-size: 10MB             # 设置单个上传文件的最大大小为10MB
      max-request-size: 50MB          # 设置整个请求(包括所有文件和表单数据)的最大大小为50MB
# 添加文件上传目录配置
file:
  upload-dir: E:/Chapter01/src/main/resources/backend/upload/  

        !!!注:路径分隔符:Windows 路径使用 / 或转义符 \\(如 E:\\path\\to\\dir)

        上述配置属性在自动配置中也提供了默认配置,具体信息如下:

spring.servlet.multipart.max-file-size:用于设置单个上传文件的大小限制,默认值为1MB;

spring.servlet.multipart.max-request-size:用于设置所有上传文件的大小限制,默认值为10MB;

如果上传文件的大小超出默认作30MB,会出现"FileUploadBase$FileSizeLimitExeeededException: The field fileupload exceeds its maximum permitted size of 1048576 bytes"异常信息。

二、创建文件上传页面

        在项目中的 src/main/resources 目录下创建 HTML(fileupload.html),页面用于操作文件上传,具体代码如下:



    
    文件上传
    


  
    
function uploadFile() { $.ajax({ url:"../fileUpload", type:"POST", cache:false, processData:false, contentType:false, dataType:"json", data: new FormData($("#myform")[0]), success:function(data){ if(data.flag == true){ $("#myimg").attr("style", "width:200px;height:200px;"); $("#myimg").attr("src", data.message); }else{ $("#myimg").remove("src"); $("#myimg").attr("alt", data.message); } } }); }

     在上述代码中,第 9~26 行代码定义了一个表单,其中,表单中必须设置 enctype属性的值为"multipartform-data",并且请求方式为post,第16 行和第 22 行代码分别定义了文件选择控件和按钮控件,并为按钮控件绑定了鼠标单击事件。第28~48 行代码定义uploadAction()方法,该方法在单击按钮时触发,触发时异步提交表单,如果提交成功,将表单中上传的图标显示在页面中。

三、创建文件上传控制器类

    在创建文件上传控制器类之前先在src/main/java目录下创建entity包,在该包下创建Result类,具体代码如下:

package org.example.chapter01.entity;
import java.io.Serializable;
/**
 * 封装返回结果
 */
public class Result implements Serializable{
    private boolean flag;//执行结果,true为执行成功 false为执行失败
    private String message;//返回结果信息,主要用于页面提示信息
    private Object data;//返回数据
    public Result(boolean flag, String message) {
        super();
        this.flag = flag;
        this.message = message;
    }
    public Result(boolean flag, String message, Object data) {
        this.flag = flag;
        this.message = message;
        this.data = data;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}

        创建文件上传控制器类在项目chapter01的com.itheima.chapter01.controller包下创建控制器类FileController,在该类中处理文件上传的请求,将上传的文件存放在指定路径下,并返回上传结果,具体代码如下:

package org.example.chapter01.controller;
import org.example.chapter01.entity.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.UUID;
@RestController
public class FileController {
    @Value("${file.upload-dir}")
    private String UPLOAD_DIR;
    @RequestMapping("/fileUpload")
    public Result fileUpload(MultipartFile[] files) {
        if (files == null || files.length == 0) {
            return new Result(false, "未选择文件!");
        }
        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                continue; 
            }
            String originalName = file.getOriginalFilename();
            String suffix = originalName.substring(originalName.lastIndexOf("."));
            if (!".jpg".equalsIgnoreCase(suffix)) {
                return new Result(false, "仅支持JPG格式图片!");
            }
            String newFileName = UUID.randomUUID() + suffix;
            File targetDir = new File(UPLOAD_DIR);
            if (!targetDir.exists()) {
                boolean created = targetDir.mkdirs();
                System.out.println("目录创建结果: " + created);
                if (!created) {
                    return new Result(false, "无法创建上传目录!");
                }
            }
            try {
                File targetFile = new File(targetDir.getAbsolutePath() + File.separator + newFileName);
                file.transferTo(targetFile);
                // 返回相对路径,前端可以通过/static-path-pattern访问
                return new Result(true, "/backend/upload/" + newFileName);
            } catch (Exception e) {
                e.printStackTrace();
                return new Result(false, "上传失败:" + e.getMessage());
            }
        }
        return new Result(true, "文件上传成功!");
    }

四、程序效果测试

        在浏览器中访问fileupload.html,如下图所示:

Spring Boot文件上传功能的实现!超详细!

        单击“选择文件”按钮,选择一个后缀名不是jpg的文件,然后单击“提交”按钮,效果如下图所示:

Spring Boot文件上传功能的实现!超详细!

        再次单击“选择文件”按钮,选择后缀名是jpg的文件,然后单击“提交”按钮,效果如下图所示:

Spring Boot文件上传功能的实现!超详细!

        由上图可以看出,页面中展示了上传的图片,此时项目src/main/resources 目录下多了一个upload文件夹,文件夹下存放了刚才上传的文件,说明文件上传成功,并且在浏览器中获取到指定静态资源文件夹中的图片。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码