SpringBoot学习:文件上传和下载
2022-01-12 15:29
579 查看
maven导入依赖
首先创建一个maven项目,然后加入以下配置,就创建好了一个springboot项目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
项目
主要是实现文件的上传和下载,所以项目结构很简单
先看一下配置文件,SpringBoot提供了文件解析类,我们需要去配置一些参数
主要是限制上传文件的大小
然后是上传文件的工具类,这里是自己写的文件操作,(使用commons-fileupload和commons-io这些写好的工具更好)
package com.david.learn.utlis; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; public class FileUtils { /** * * @param input 输入的文件流 * @param filePath 文件要保存的路径 * @throws IOException */ public static void upload(InputStream input, File filePath) throws IOException { FileOutputStream output = new FileOutputStream(filePath); byte[] bytes = new byte[4096]; int n ; while (-1 != (n = input.read(bytes)) ) { output.write(bytes,0,n); } } /** * 将文件下载到客户端 * * @param filePath * @param fileName * @param response * @param isOnLine 是否在线打开 * @throws Exception */ public static void download(String filePath, String fileName, HttpServletRequest request, HttpServletResponse response, boolean isOnLine) throws Exception { File f = new File(filePath); BufferedInputStream br = new BufferedInputStream(new FileInputStream(f)); byte[] buf = new byte[1024]; int len = 0; response.reset(); // 非常重要 // 解决文件名中文乱码问题 String fileNameDisplay = URLEncoder.encode(fileName, "UTF-8"); // 针对火狐浏览器需要特殊处理 if ("FF".equals(getBrowser(request))) { fileNameDisplay = new String(fileName.getBytes("UTF-8"), "iso-8859-1"); } // 在线打开方式 if (isOnLine) { response.setHeader("Content-Disposition", "inline; filename=" + fileNameDisplay); } // 纯下载方式 else { response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition", "attachment; filename=" + fileNameDisplay); } OutputStream out = response.getOutputStream(); while ((len = br.read(buf)) > 0) { out.write(buf, 0, len); } out.flush(); br.close(); out.close(); } /** * 判断客户端浏览器类型 * * @param request * @return */ private static String getBrowser(HttpServletRequest request) { String UserAgent = request.getHeader("USER-AGENT").toLowerCase(); if (UserAgent != null) { if (UserAgent.indexOf("msie") >= 0) { return "IE"; } if (UserAgent.indexOf("firefox") >= 0) { return "FF"; } if (UserAgent.indexOf("safari") >= 0) { return "SF"; } } return null; } }
在写controller代码之前,还需要写一个接口调用后返回的响应类
package com.david.learn.dto; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class BaseReturnDto { // 返回码 private int code; // 结果说明 private String msg; }
最后是controller的代码,总共写了三个接口,分别是上传文件、下载文件、在线查看文件
- 查看文件还得看浏览器是否支持,一般查看pdf文件是可以的
package com.david.learn.controller; import com.david.learn.dto.BaseReturnDto; import com.david.learn.utlis.FileUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; @RestController public class FileOperateController { // 当前项目绝对路径 private static final String PROJECT_PATH = new File("").getAbsolutePath(); // 文件上传的路径 private static final String UPLOAD_PATH = PROJECT_PATH + "/upload/"; // 最好手动在项目里创建文件夹,如果不想手动创建,加上这段代码 static { // 项目里没有upload这个文件夹时,会自动创建 File file = new File(UPLOAD_PATH); if (!file.exists()){ if (!file.mkdirs()) { throw new RuntimeException("创建文件夹失败"); } } } /** * 文件上传 */ @PostMapping("/uploadFile") // 使用数组可以实现多文件上传,单文件的话不用数组 public BaseReturnDto uploadFile(MultipartFile[] multipartFile) throws IOException { for (MultipartFile file : multipartFile) { String fileLocation = UPLOAD_PATH + file.getOriginalFilename(); FileUtils.upload(file.getInputStream(), new File(fileLocation)); } return new BaseReturnDto(200, "文件上传成功"); } /** * 文件下载 */ @GetMapping("/downloadFile/fileName/{fileName}") public BaseReturnDto download(HttpServletRequest request, HttpServletResponse response, @PathVariable String fileName) { try { FileUtils.download(UPLOAD_PATH + fileName, fileName, request, response, false); return new BaseReturnDto(200, "文件下载成功"); } catch (Exception e) { e.printStackTrace(); return new BaseReturnDto(500, "文件下载失败"); } } /** * 在线查看文件 */ @GetMapping("/watchFile/fileName/{fileName}") public BaseReturnDto watch(HttpServletRequest request, HttpServletResponse response, @PathVariable String fileName) { try { FileUtils.download(UPLOAD_PATH + fileName, fileName, request, response, true); return new BaseReturnDto(200, "文件查看成功"); } catch (Exception e) { e.printStackTrace(); return new BaseReturnDto(500, "文件查看失败"); } } }
测试接口
使用postman测试接口,结果完美
相关文章推荐
- 从.Net到Java学习第十篇——Spring Boot文件上传和下载
- spring boot文件上传、下载
- SpringBoot下文件上传与下载的实现
- 七、springBoot 简单优雅是实现文件上传和下载
- SpringBoot下文件上传与下载的实现
- spring boot 实现文件上传和下载,以及多文件上传
- Spring boot文件上传下载
- FastDFS 分布式文件系统安装与集成最后并与SpringBoot 集成文件上传与下载
- SpringBoot下文件上传与下载的实现
- springboot文件上传下载
- SpringBoot文件上传下载和多文件上传(图文详解)
- Spring Boot 文件上传与下载的示例代码
- springboot单文件上传和下载
- SpringBoot 从零开始学习(四) 之文件上传
- Springboot 简单实现文件上传和下载功能
- SpringBoot后台如何实现文件上传下载
- SpringBoot下文件上传与下载的实现
- SpringBoot 学习记录(五)- 文件上传(和图片服务器fastdfs测试)
- springBoot通过表单的提交进行AmazonS3 进行文件的上传下载删除(不存储在本地)。
- SpringBoot文件上传下载和多文件上传(图文详解)