解决 浏览器下载通过Controller接口下载文件,不兼容问题(实际上文件是存在的):
谷歌浏览器和Microsoft浏览器
无法下载的截图结果如下: 看看Microsoft浏览器,也是无法下载的: 同样不能下载!!!!
但是火狐和postman是可以的,
火狐浏览器下载截图如下: 使用火狐浏览器是OK的!!!!
使用postman如下: 也是OK的;
下面看源码并给出解决的方案:
@GetMapping("/downloadASingleFile")
public void downloadASingleFile(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
String path = getDownloadDir();
Path filePath = Paths.get(path, fileName);
if (!Files.exists(filePath)) {
throw new FileNotFoundException("下载的文件不存在, 路径为:" + filePath);
}
writeFileToResponse(filePath, request, response);
}
writeFileToResponse 方法
public void writeFileToResponse(Path filePath, HttpServletRequest request,
HttpServletResponse response) throws IOException {
if (!Files.exists(filePath)) {
throw new FileNotFoundException(filePath.toString());
}
String browser = request.getHeader("user-agent");
int httpStatus = 206;
if (browser.contains("MSIE"))
httpStatus = 200;
response.reset();
response.setStatus(httpStatus);
response.setContentType("application/octet-stream");
File file = filePath.toFile();
response.setHeader("Content-Disposition", "Attachment;filename=" + file.getName());
response.setHeader("Content-Length", file.length() + "");
try (FileInputStream in = new FileInputStream(file);) {
byte[] buffer = new byte[getBufferSize()];
int length = 0;
while ((length = in.read(buffer)) > 0) {
rateLimit();
response.getOutputStream().write(buffer, 0, length);
}
response.getOutputStream().flush();
} catch (IOException e) {
throw e;
}
response.flushBuffer();
}
解决办法: 修改writeFileToResponse 方法,修改之后如下:
public void writeFileToResponse(Path filePath, HttpServletRequest request,
HttpServletResponse response) throws IOException {
if (!Files.exists(filePath)) {
throw new FileNotFoundException(filePath.toString());
}
response.setContentType("application/octet-stream");
File file = filePath.toFile();
response.setHeader("Content-Disposition", "Attachment;filename=" + file.getName());
response.setHeader("Content-Length", file.length() + "");
try (FileInputStream in = new FileInputStream(file);) {
byte[] buffer = new byte[getBufferSize()];
int length = 0;
while ((length = in.read(buffer)) > 0) {
rateLimit();
response.getOutputStream().write(buffer, 0, length);
}
response.getOutputStream().flush();
} catch (IOException e) {
throw e;
}
response.flushBuffer();
}
解决之后: 谷歌浏览器下载成功!!
Microsoft浏览器下载成功!!! 当然,在修改之后火狐浏览器依然兼容,这就解决了不兼容的问题。!!!!
|