我的后端保存了.xlsx,.docx和.pdf文件。下载控制器如下所示:
@RestController
public class FileDownload {
@RequestMapping(value = "/files/{file_name}/", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void getFile(
@PathVariable("file_name") String file,
HttpServletResponse response) throws Exception {
String fileType=file.split("\\.")[1];
switch(fileType){
case "xlsx": response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
break;
case "docx": response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
break;
case "pdf": response.setContentType("application/pdf");
break;
default: response.setContentType("application/octet-stream");
break;
}
response.setHeader("Content-Disposition", "attachment; filename=" + file);
response.setHeader("Content-Length", String.valueOf(file.length()));
InputStream is = FileDownload.class.getResourceAsStream("/files/" + file);
copy(is, response.getOutputStream());
response.flushBuffer();
}
}
当试图打开文件时,excel告诉我它已损坏并需要修复。修复过程也失败了。
可能导致此错误的原因是什么?
有很多类似的问题,但提出的解决方案似乎都没有效果。
唯一的"修复"有效的是附加"下载"属性到下载文件的前端链接。但遗憾的是,这对IE来说并不起作用。
答案 0 :(得分:0)
我在下载zip文件时遇到了同样的问题。我的解决方案最终是从我的控制器返回一个字节数组(参见https://stackoverflow.com/a/33302570/4921953),然后以不同的方式在我的JavaScript前端处理Chrome / Firefox(我使用你使用的下载属性)和Internet资源管理器(见https://stackoverflow.com/a/24354303/4921953)。当您从前端向服务器发出HTTP请求时,请确保将responseType设置为“arraybuffer”。