Spring boot文件上传和下载是经常用到的,这里分享一下Spring boot文件上传的代码,网上这类代码也比较多,但是这个代码还算是比较简洁,没有文件流的操作。
@GetMapping("/file/{id}")
private ResponseEntity<Resource> downFile(@PathVariable String id,HttpServletRequest request, HttpServletResponse response) {
//自己的业务,获取id相关文件
OSSMaterialInfoResult ossMaterialInfoResult = materialService.queryByUUID(id);
if (ossMaterialInfoResult != null) {
OSSInformation ossInformation = ossInformationService.queryOne();
String root = ossInformation.getRoot();
String path = root + ossMaterialInfoResult.getStorePath();
//自己的业务,获取id相关文件
File file = new File(path);
if (file.exists()) {
Resource resource = loadFileAsResource(path);
String contentType = null;
try {
//加了这里在PostMan里下载可以正确显示文件类型
contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
} catch (IOException ex) {
ex.printStackTrace();
}
if(contentType == null) {
contentType = "application/octet-stream";
}
String fileName=ossMaterialInfoResult.getOriginalName();
//处理中文名字的问题
try {
if ("FF".equals(getBrowser(request))) {
// 针对火狐浏览器处理方式不一样了
fileName = new String(fileName.getBytes("GB2312"), "ISO-8859-1");
}else{
fileName = URLEncoder.encode(fileName, "UTF-8");//encode解决中文乱码
fileName = fileName.replace("+", "%20");//encode后替换 解决空格问题
}
}catch (Exception e){
fileName=ossMaterialInfoResult.getOriginalName();
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName+"\"")
.body(resource);
}
}
return null;
}
/**
* 加载文件
* @return 文件
*/
public Resource loadFileAsResource(String path) {
try {
Path filePath = Paths.get(path).normalize();
Resource resource = new UrlResource(filePath.toUri());
if(resource.exists()) {
return resource;
} else {
throw new Exception("File not found " + path);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 以下为服务器端判断客户端浏览器类型的方法
* @param request
* @return
*/
private String getBrowser(HttpServletRequest request) {
String UserAgent = request.getHeader("USER-AGENT").toLowerCase();
if (UserAgent != null) {
if (UserAgent.indexOf("msie") != -1)
return "IE";
if (UserAgent.indexOf("firefox") != -1)
return "FF";
if (UserAgent.indexOf("safari") != -1)
return "SF";
}
return null;
}
代码中加入填补了PostMan里下载无法识别文件类型的坑,但还是有缺点的,就是在PostMan里下载的文件,文件包为url编码之后的