从Web应用程序

时间:2015-09-18 14:56:48

标签: java spring-mvc tomcat8

我在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 ++打开它们会显示一些有趣的内容。两个文件中的二进制字符不同,如下例所示:

NonsenseNonsense

输出流的类型为org.apache.catalina.connector.CoyoteOutputStream

看起来它是内容编码问题。如果保留默认值不起作用,如何找到这些文件的正确编码?

旁注:我最初发布文件被“截断”,因为打开它们(使用Notepad ++,早期问题中未提及)只显示了几十行。这看起来是正确的,我被文件的小尺寸误导,并认为双重换行正在削减响应实体

0 个答案:

没有答案