详解SpringBoot下文件上传与下载的实现
文件上传
在SpringBoot中,我们可以通过MultipartFile类型的参数来实现文件上传。步骤如下:
- 在前端,添加一个文件的input框,并设置为
type="file"
。
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit">上传</button>
</form>
- 在后端的Controller中,定义一个接收文件的方法,并使用
@RequestParam("file") MultipartFile file
来接收文件。
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
// do something with the file
return "success";
}
- 接收文件后,我们可以通过MultipartFile的方法来获得文件的相关信息,如文件名、大小等,并保存文件。
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
String fileName = file.getOriginalFilename();
long fileSize = file.getSize();
// 保存文件
File destFile = new File("/path/to/save/" + fileName);
try {
file.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
return "error";
}
return "success";
}
- 文件上传的配置
在application.properties
中配置文件上传相关参数:
# 文件上传配置
# 存储位置
file.upload.dir=/path/to/save/
# 文件大小限制(单位MB)
file.max-size=10
然后在WebMvcConfigurer
中添加文件上传相关的Bean,具体内容如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${file.upload.dir}")
private String uploadDir;
@Value("${file.max-size}")
private long maxFileSize;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file:" + uploadDir);
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation(uploadDir);
factory.setMaxFileSize(DataSize.ofMegabytes(maxFileSize));
return factory.createMultipartConfig();
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxUploadSize(maxFileSize * 1024 * 1024);
resolver.setMaxInMemorySize(4096);
return resolver;
}
}
文件下载
文件下载相对于文件上传而言要更加简单,主要有两种方式:一种是通过直接打开文件链接下载,另一种是通过响应头来实现。
直接打开文件链接下载
在前端,我们只需提供一个链接即可:
<a href="/download?fileName=myfile.txt">下载</a>
在后端的Controller中,我们只需将文件流写入响应中即可:
@GetMapping("/download")
public void downloadFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {
File file = new File("/path/to/" + fileName);
try (InputStream is = new BufferedInputStream(new FileInputStream(file));
OutputStream os = response.getOutputStream()
) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
IOUtils.copy(is, os);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
响应头下载
在前端,我们需要通过Ajax获取文件内容,并获取文件名。
$.ajax({
url: "/download",
method: "post",
responseType: "arraybuffer",
data: {fileName: "myfile.txt"}
}).done(function (response) {
var blob = new Blob([response], {type: "text/plain"});
var fileName = "myfile.txt";
var link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
});
在后端,我们只需将文件流写入响应中即可:
@PostMapping("/download")
public void downloadFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {
File file = new File("/path/to/" + fileName);
try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
以上就是文件上传和下载的两种实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot下文件上传与下载的实现 - Python技术站