文件上传与下载
在实际项目中,经常需要文件的上传和下载功能,如果使用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,进入以下界面,进行操作即可。