模式切换
Spring Boot 实现文件上传、下载功能
Spring Boot 中实现图片上传和下载功能主要涉及到 Spring MVC 的 MultipartFile 类以及文件读写操作。
- 引入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
- 编写配置
yaml
spring:
servlet:
multipart:
max-file-size: 10MB # 单个文件最大大小
max-request-size: 10MB # 请求最大大小
- 编写配置类
java
/**
* 资源配置
*/
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
private final static RESOURCE_PREFIX = "/profile";
private final static PROFILE = "/Users/hayden/Downloads";
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
// 本地文件上传路径
registry.addResourceHandler(RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + PROFILE + "/");
}
}
- 编写 Controller
java
@Slf4j
@RestController
public class FileController {
private final static RESOURCE_PREFIX = "/profile";
private final static PROFILE = "/Users/hayden/Downloads";
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return R.fail("上传文件不能为空");
}
String uploadDir = PROFILE + "/";
String extension = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
String fileName = System.currentTimeMillis() + extension;
File dest = new File(uploadDir + fileName);
String url = null;
HashMap<String, String> map = new HashMap<>();
try {
file.transferTo(dest);
url = serverConfig.getUrl() + RESOURCE_PREFIX + "/" + fileName;
map.put("name", fileName);
map.put("url", url);
} catch (IOException e) {
log.error("上传文件失败", e);
return R.fail("上传文件失败", e.getMessage());
}
log.info("上传文件成功,文件:" + map);
return R.ok(map);
}
@GetMapping("/download")
public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) {
if (fileName != null) {
File file = new File(PROFILE + "/" + fileName);
if (file.exists()) {
response.setContentType("application/force-download");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
log.info("下载文件成功,文件:" + fileName);
} catch (Exception e) {
log.error("下载文件失败", e);
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}