@RestController
@RequestMapping("file")
public class DownloadController {
// 下载文件的根路径
private String downloadPath = "C:\\mydata\\generator";
@GetMapping("download")
public ResponseEntity<byte[]> downlaodFile(HttpServletRequest request, @RequestParam("path") String path
, @RequestHeader("user-agent") String userAgent, @RequestParam("filename") String filename
,@RequestParam(required = false,defaultValue = "false") boolean inline ) {
// 根路径加上传参数的路径构成文件路径地址
String realPath = downloadPath + path;
File file = new File(realPath);
// 构建响应
ResponseEntity.BodyBuilder bodyBuilder = ResponseEntity.ok();
bodyBuilder.contentLength(file.length());
// 二进制数据流
bodyBuilder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 文件名编码
try {
String encodeFileName = URLEncoder.encode(filename, "UTF-8");
// IE
if (userAgent.indexOf("MSIE")>0){
bodyBuilder.header("Content-Disposition","attachment;filename="+encodeFileName);
}else {
// 其他浏览器
if (inline){
// 在浏览器中打开
URL url = new URL("file:///" + file);
bodyBuilder.header("Content-Type",url.openConnection().getContentType());
bodyBuilder.header("Content-Disposition","inline;filename*=UTF-8''"+encodeFileName);
}else {
// 直接下载
bodyBuilder.header("Content-Disposition","attachment;filename*=UTF-8''"+encodeFileName);
}
}
// 下载成功返回二进制流
return bodyBuilder.body(FileUtils.readFileToByteArray(file));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
// 下载失败直接返回错误的请求
return (ResponseEntity<byte[]>) ResponseEntity.badRequest();
}
}
四 tomcat配置
主要是开发特殊字符斜杆,如果是在linux上开发,那就自定义路径,这个步骤可以省略;
@Configuration
public class ServerConfig {
//Url路径添加支持字符
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
//设置Tomcate 支持
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedQueryChars", "\\");
}
});
return factory;
}
}
五 浏览器测试
下载路径
http://localhost:8080/file/download?path=\2019\11\c7ed67a6-5502-479b-8934-736021426236.jpg&filename=5555.jpg
生成结果
文件下载
最新推荐文章于 2024-05-09 19:36:13 发布