我在Spring MVC中下载PDF,Zip或XLSX自动生成的文件时出现“简单”问题。
我有一个Exporter
组件,可以将数据集直接导出为CSV,PDF,XLSX(普通或压缩)格式的通用OutputStream
。
在JUnit中使用临时文件作为目标OutputStream
运行它成功。但是,如果我使用Spring MVC的自动连线响应OutputStream
运行该组件,那么响应会被破坏
@RequestMapping("/export")
public void export(@RequestBody ..., HttpServletResponse response)
throws IOException, ExportException
{
webExportService.export(MyEntity.class, exportRequest, sessionFactory, response.getOutputStream(), response);
}
public <T> void export(Class<T> clazz, RequestBean exportInfo, SessionFactory sessionFactory, OutputStream outputStream,
HttpServletResponse httpResponse) {
httpResponse.setContentType(getMimeType());
httpResponse.setHeader("Content-Disposition", "attachment; filename=" + getFileName() + "");
httpResponse.setHeader("Pragma", "public");
httpResponse.setHeader("Cache-control", "must-revalidate");
export(clazz, exportInfo, sessionFactory, outputStream); //this will write to the outputStream
}
[编辑]主要需要重播。对不起,我现在重新阅读了我发现的问题,我说的很糟糕
当我尝试打开ZIP,PDF和XLSX类型的文件时,默认编辑器无法打开这些文件。与临时文件夹副本相比,使用Notepad ++打开它们会显示一些有趣的内容。两个文件中的二进制字符不同,如下例所示:
输出流的类型为org.apache.catalina.connector.CoyoteOutputStream
。
看起来它是内容编码问题。如果保留默认值不起作用,如何找到这些文件的正确编码?
旁注:我最初发布文件被“截断”,因为打开它们(使用Notepad ++,早期问题中未提及)只显示了几十行。这看起来是正确的,我被文件的小尺寸误导,并认为双重换行正在削减响应实体