通过弹簧控制器下载的文件已损坏

时间:2016-12-23 11:44:45

标签: spring download file-type

我的后端保存了.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来说并不起作用。

1 个答案:

答案 0 :(得分:0)

我在下载zip文件时遇到了同样的问题。我的解决方案最终是从我的控制器返回一个字节数组(参见https://stackoverflow.com/a/33302570/4921953),然后以不同的方式在我的JavaScript前端处理Chrome / Firefox(我使用你使用的下载属性)和Internet资源管理器(见https://stackoverflow.com/a/24354303/4921953)。当您从前端向服务器发出HTTP请求时,请确保将responseType设置为“arraybuffer”。