Spring MVC下载关于chrome问题的PDF

时间:2016-05-20 10:16:48

标签: android spring google-chrome spring-mvc pdf

我有两个服务来生成和下载PDF文件。首先是POST(用于隐藏数据),它在会话中保存数据,生成唯一ID并返回它。 第二个服务是GET(param是来自POST的唯一ID),它从会话中删除id,生成PDF并将其作为流返回。它看起来像:

@RequestMapping(value = "/get", method = RequestMethod.GET)
@ResponseBody
public HttpEntity<byte[]> getData(
        @ApiParam(name="hash", value="hash", required=true)
        @RequestParam(value="hash", required = true) String hash,
        @Context HttpServletResponse response) throws IOException {
    Map reportData = reportsContext.getReportData(hash);

    /*generate PDF here*/   

    return new HttpEntity<>(report.getContent(), getHeaders(report));
}

和getHeaders()是:

private HttpHeaders getHeaders(ReportData report) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.valueOf("application/pdf"));
    headers.add("Content-Disposition", "attachment; filename=".concat(report.getTitle()).concat(".pdf"));
    return headers;
}

它通常适用于所有浏览器和系统,但Android Chrome。首先,我发现Android上的Chrome发送了两个GET(一个来自浏览器,另一个来自下载管理器) - 因为散列被删除,第二个GET有异常。下一步是在会话中保存生成的流(&gt;。&lt;)并在第二次GET时返回它 - 尽管返回的流是相同的(当从getData()返回时),第二个响应是不良格式化的。我想这是某种Spring问题,不知何故它会改变格式化。

有回复的首字母缩写: 第一次GET:

  

HTTP / 1.1 200 OK X-Powered-By:Express服务器:Apache-Coyote / 1.1   内容 - 性格:附件;   filename = operation_20052016.pdf内容类型:   application / pdf content-length:28626 date:星期五,2016年5月20日07:51:08   GMT连接:关闭

     

%PDF-1.4%â€Ď

第二次GET:

  

HTTP / 1.1 200 OK X-Powered-By:Express服务器:Apache-Coyote / 1.1   内容 - 性格:附件;   filename = operation_20052016.pdf内容类型:   application / pdf transfer-encoding:chunked date:2016年5月20日星期五   07:51:13 GMT连接:关闭

     

2000“JVBERi0xLjQKJeLj

------------ ------------ ANSWER

最后我把手动生产的属性,如:

request.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(MediaType.valueOf("application/pdf")));

在返回正确的PDF之前。如果出现错误,我不设置生成属性,因此它采用默认值。

1 个答案:

答案 0 :(得分:0)

解答: 最后我把手动生产的属性,如:

request.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(MediaType.valueOf("application/pdf")));

在返回正确的PDF之前。如果出现错误,我不设置生成属性,因此它采用默认值。