Spring Boot(六):文件上传

文件上传的操作

基本上每一个项目都涉及文件上传这个功能吧,SpringBoot同样也提供这样的支持。
首先,用户需要在前台选择一个文件,然后通过按钮发送请求。在以前我们的视图层会选择使用jsp来做,但是在SpringBoot中,不推荐这种方式,它推荐一种叫做模板引擎的东西。

模板引擎:

  1. Freemarker:文件一般保存为 xxx.ftl
  2. Thymeleaf (主推),直接是html结尾

至于模板引擎,后续的文章会推出,因为这里会用到,所以提一下。要想让SpringBoot成功返回页面,就需要导入相关的约束了,这里就以Thymeleaf为例。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

当然,还需要web相关的约束。

然后在resources目录下的templates文件夹创建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form enctype="multipart/form-data" method="post" action="/upload">
        文件:<input type="file" name="file" /><br/>
        姓名:<input type="text" name="name"><br/>
<input type="submit" value="上传"/>
    </form>
</body>
</html>

只是做个演示,就没有什么样式可说了,然后请求地址已经写好,就让后端来处理逻辑吧。

package com.qfcwx.springbootfileupload.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @ClassName: FileController
 * @Author: 清风一阵吹我心
 * @Description: TODO
 * @Date: 2019/3/9 12:51
 * @Version 1.0
 **/
@RestController
public class FileController {

    private static final String FILE_PATH = "D:/idea_workspace/SpringBootDemo/SpringBoot/springboot-fileupload/src/main/resources/images/";


    @PostMapping(value = "/upload")
    public String upload(@RequestParam("file")MultipartFile file, HttpServletRequest request){

        String name = request.getParameter("name");
        System.out.println("用户名:"+name);

        //获取文件名
        String fileName = file.getOriginalFilename();
        System.out.println("上传的文件名:" + fileName);

        //获取文件的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //获取文件前缀
        String prefixName = fileName.substring(0, fileName.lastIndexOf("."));

        //上传文件后的名称
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
        String date = dateFormat.format(new Date());

        fileName = prefixName + date + suffixName;
        File dest = new File(FILE_PATH + fileName);

        try {
            file.transferTo(dest);
            return name+"上传文件成功,上传后的文件名为:"+fileName;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败!";
    }
}

FILE_PATH:指上传后文件的保存路径。
MultipartFile:实则是SpringMvc提供的一种操作文件上传的类。
file.getOriginalFilename():这个方法可以获取对象中的文件名。
我这里取文件的前缀和后缀,然后加上一个时间戳,作为保存文件的名称。
file.transferTo(dest):方法将上传文件写到服务器上指定的文件。
以前传文件是以流的形式来读取和写入,使用这种方式可以更方便的操作文件。

基本上所有配置和代码都搞定了,下面就是测试环节了,启动项目。

首先看到这个界面,然后选择文件,填写用户名,点击上传按钮。

然后看到返回了这一串东西,证明文件上传成功。

如果你以为这么简单就完了么?实际上不是这样。传文件的搞定了,可是上传文件的大小呢?倘若你想传一首歌,就会发现,后台会抛出异常。
所以,我们还需要对文件大小限制做修改。SpringBoot默认限制文件大小不能超过1MB,这也忒小了。

解决办法分两种:
(一)使用java代码来配置bean。

    @Bean
    public MultipartConfigElement multipartConfigElement(){
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofMegabytes(20));
        factory.setMaxRequestSize(DataSize.ofMegabytes(30));
        return factory.createMultipartConfig();
    }

在启动类中加入上面的代码即可。
factory.setMaxFileSize:设置单个文件的大小。
factory.setMaxRequestSize:设置总上传的数据大小。

DataSize是以前没使用过的类,但是看API文档,上面有详细的介绍。

"12KB"  -- parses as "12 kilobytes"
 "5MB"  -- parses as "5 megabytes"
 "20"   -- parses as "20 bytes"

大概意思就是:
如果想限制为KB大小,就使用DataSize.ofKilobytes()这个方法。
如果想限制为MB大小,就使用DataSize.ofMegabytes()这个方法。
如果想限制为字节大小,就使用DataSize.ofBytes()这个方法。

我这里设置为20MB。然后重启项目,选择一首歌上传,就会看到成功的结果了。

(二)使用配置文件的方式

spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=100MB

好,打完收工,是不是配置文件的方式很简单呢,就这么一丢丢~这就是SpringBoot带来的便捷。
重启项目,也能长传成功了。

后面的演示,就不放图了。可以自己动手操作。本期到此结束,下期再见。

拥有希望的人,和满天的星星一样,是永远不会孤独的。找到和自己一样的星星,把通往自由的路, 照亮吧!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值