我有两个服务来生成和下载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之前。如果出现错误,我不设置生成属性,因此它采用默认值。
答案 0 :(得分:0)
解答: 最后我把手动生产的属性,如:
request.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(MediaType.valueOf("application/pdf")));
在返回正确的PDF之前。如果出现错误,我不设置生成属性,因此它采用默认值。