文件上传的操作
基本上每一个项目都涉及文件上传这个功能吧,SpringBoot同样也提供这样的支持。
首先,用户需要在前台选择一个文件,然后通过按钮发送请求。在以前我们的视图层会选择使用jsp来做,但是在SpringBoot中,不推荐这种方式,它推荐一种叫做模板引擎的东西。
模板引擎:
- Freemarker:文件一般保存为 xxx.ftl
- 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带来的便捷。
重启项目,也能长传成功了。
后面的演示,就不放图了。可以自己动手操作。本期到此结束,下期再见。
拥有希望的人,和满天的星星一样,是永远不会孤独的。找到和自己一样的星星,把通往自由的路, 照亮吧!