SpringBoot实现文件上传功能

2022-01-24 0 772

经典的文件上传

服务器处理上传文件一般都是先在请求中读取文件信息,然后改变名称保存在服务器的临时路径下,最后保存到服务器磁盘中。本次以thymeleaf搭建demo,因此需要引入thymeleaf依赖库。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.5.5</version>
</dependency>

如果使用的是gradle构建的项目,需要修改build.gradle文件:

compile \'org.springframework.boot:spring-boot-starter-thymeleaf:2.5.5\'

新建一个Action类负责处理上传的文件:

@RestController
@RequestMapping(\"/upload/*\")
public class UploadAction {

    @PostMapping(\"/file\")
    public Object uploadHandler(HttpServletRequest request, String title, MultipartFile file) {
        Map<String, Object> resultMap = new LinkedHashMap<>();
        resultMap.put(\"title\", title);
        resultMap.put(\"fileName\", file.getName()); // 文件名
        resultMap.put(\"originalFilename\", file.getOriginalFilename()); // 原始名称
        resultMap.put(\"content-type\", file.getContentType()); // 文件类型
        resultMap.put(\"fileSize\", file.getSize() / 1024 + \"K\"); // 文件大小
        try {
            // 保存文件
            String uploadedFilePath = saveFile(request, file.getInputStream(), file.getOriginalFilename()
                    .substring(file.getOriginalFilename().lastIndexOf(\".\") + 1));
            resultMap.put(\"uploadedFilePath\", uploadedFilePath); // 文件大小
        } catch (IOException e) {
            System.err.println(\"error-path: /upload/file, message: \" + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 保存上传的文件到本地服务器
     *
     * @param request HttpServletRequest
     * @param input   输入流
     * @param ext     文件扩展名
     * @return 文件路径
     * @throws IOException
     */
    public String saveFile(HttpServletRequest request, InputStream input, String ext) throws IOException {
        String realPath = request.getServletContext().getRealPath(\"/upload/file/\"); // 取得服务器真实路径
        File file = new File(realPath);
        if (!file.getParentFile().exists()) { // 目录不存在
            file.mkdirs(); // 创建多级目录
        }
        String filePath = realPath + UUID.randomUUID() + \".\" + ext;
        // 取的文件输出流
        OutputStream out = new FileOutputStream(filePath);
        byte[] data = new byte[2048]; // 缓冲数组2KB
        int len = 0; // 读取字节长度
        while ((len = input.read(data)) != -1) {
            out.write(data, 0, len); // 文件写入磁盘
        }
        if (input != null) {
            input.close();
        }
        out.close();
        return filePath;
    }
}

在resources目录下新建templates文件夹,在里面创建index.html文件作为项目首页展示。

<!doctype HTML>
<html xmlns:th=\"http://www.thymeleaf.org\">
    <head>
        <title>文件上传测试</title>
        <meta charset=\"UTF-8\" />
    </head>
    <body>
        <form action=\"/upload/file\" method=\"post\" enctype=\"multipart/form-data\">
            <span>标题:</span>
            <input type=\"text\" name=\"title\" /><br>
            <span>文件:</span>
            <input type=\"file\" name=\"file\" /><br>
            <input type=\"submit\" value=\"上传\"  />
        </form>
    </body>
</html>

启动项目,直接访问:http://localhost:8080/将进入index.html页面。

点击上传按钮,文件将被保存到服务器磁盘中:

SpringBoot对上传文件处理的简化

SpringBoot对FileUpload组件进行了整合,在文件保存的时候可以避免直接操作IO流,通过配置文件的方式指定文件上传的限制参数。修改application.yml文件:

server:
  port: 8080
spring:
  servlet:
    multipart:
      enabled: true  # 启用文件上传
      max-file-size: 1MB # 单文件上传最大限制
      max-request-size: 10MB # 文件上传最大值
      file-size-threshold: 10KB # 上传文件达到多大时写入磁盘
      location: / # 临时文件存储位置

修改UploadAction,使用MultipartFile类的transferTo方法保存上传文件。

@RestController
@RequestMapping(\"/upload/*\")
public class UploadAction {
    @PostMapping(\"/file\")
    public Object uploadHandler(HttpServletRequest request, String title, MultipartFile file) {
        Map<String, Object> resultMap = new LinkedHashMap<>();
        resultMap.put(\"title\", title);
        resultMap.put(\"fileName\", file.getName()); // 文件名
        resultMap.put(\"originalFilename\", file.getOriginalFilename()); // 原始名称
        resultMap.put(\"content-type\", file.getContentType()); // 文件类型
        resultMap.put(\"fileSize\", file.getSize() / 1024 + \"K\"); // 文件大小
        try {
            // 保存文件
            String etc = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(\".\") + 1);
            String serverPath = request.getScheme() + \"://\" + request.getServerName()
                    + \":\" + request.getServerPort() + request.getContextPath() + \"/file/upload/\";
            String fileName = UUID.randomUUID() + \".\" + etc;
            resultMap.put(\"filePath\", serverPath + fileName); // 文件地址(服务器访问地址)
            // 文件保存再真实路径下
            File saveFile = new File(request.getServletContext().getRealPath(\"/file/upload/\") + fileName);
            if (!saveFile.getParentFile().exists()) { // 目录不存在,创建目录
                saveFile.mkdirs();
            }
            file.transferTo(saveFile); // 保存上传文件
        } catch (IOException e) {
            System.err.println(\"error-path: /upload/file, message: \" + e.getMessage());
        }
        return resultMap;
    }
}

访问:http://localhost:8080/

点击上传按钮:

在浏览器上访问filePath,可以预览上传的文件:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 SpringBoot实现文件上传功能 http://www.20zxx.cn/297136/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务