文件上传与下载
在实际项目中,经常需要文件的上传和下载功能,如果使用Apache的Commons-fileupload和commons-io包实现,会编写大量的代码;而SpringBoot对其进行了封装简化,只需要少量的代码便可以实现文件上传下载的功能。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编写配置文件
# 关闭thymeleaf缓存,防止更改不生效
spring.thymeleaf.cache=false
# 设置文件上传的大小上限(默认1M),单位是字节(KB)
spring.servlet.multipart.max-file-size=10485760
# 设置静态文件路径,可以直接访问html文件
spring.resources.static-locations=classpath:/templates/
编写Demo页面
在src/resource/templates文件夹下,新建一个FileDemo.html文件。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>文件上传示例</h2>
<div>
<form method="POST" enctype="multipart/form-data" action="/file/upload">
<p>
<input type="file" name="multipartFile"/>
<input type="submit" value="上传"/>
</p>
</form>
</div>
<br>
<h2>文件下载示例</h2>
<div>
<a href="/file/download">下载文件</a>
</div>
</body>
</html>
编写控制器
@RestController
@RequestMapping("/file")
public class FileController {
/**
* 文件上传
* @param multipartFile
* @return
*/
@PostMapping(value = "/upload")
public boolean uploadFile(MultipartFile multipartFile){
String root = "D:\\数据\\";
//加时间戳防止重名
String filename = System.currentTimeMillis() + "_" + multipartFile.getOriginalFilename();
//创建目标文件位置
File file = new File(root+filename);
//写入文件
try {
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 文件下载
*/
@GetMapping(value = "/download")
public void downloadFile(HttpServletResponse response) throws IOException {
//设置编码
response.setCharacterEncoding("UTF-8");
//设置资源的MIME类型
response.setContentType("application/x-jpg;charset=UTF-8");
//设置现在文件的文件名(使用URLEncode,防止中文乱码)
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("示例图片.jpg","UTF-8"));
//读写文件
FileInputStream fileInputStream = new FileInputStream("D://1.jpg");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = bufferedInputStream.read(buffer);
while(len != -1){
out.write(buffer);
len =bufferedInputStream.read(buffer);
}
//关闭流
bufferedInputStream.close();
fileInputStream.close();
out.close();
}
}
- 测试
在浏览器输入localhost:8080/FileDemo.html,进入以下界面,进行操作即可。
测试界面.png
网友评论