我是stackoverflow的新手,因此这是我的第一篇文章。请原谅我可怜的英语......我花了几个小时讨论相关话题但没有满足我的需求。 我正在编写一本地址簿,我希望我的用户能够随时下载pdf联系人列表。一切似乎都顺利但实际上客户端从不下载pdf文件,尽管我可以使用chrome开发人员工具在请求中看到它。 这是我的代码:
public void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException {
try {
Document document = new Document();
PdfWriter.getInstance( document, response.getOutputStream() );
document.open();
document.add( new Paragraph( "You've selected " + request.getParameter("number") + " contacts." ) );
response.setContentType("application/pdf");
response.setHeader( "Content-Disposition", "attachment; filename=\"contacts.pdf\"" );
document.close();
}
catch( DocumentException e ) {
e.printStackTrace();
}
}
在检查响应时,我得到这样的结果:
%PDF-1.4 %���� 2 0 obj >stream x�+�r �26S�00S 5 0 obj > endobj 6 0 obj > endobj xref 0 7 0000000000 65535 f 0000000320 00000 n 0000000015 00000 n 0000000408 00000 n 0000000163 00000 n 0000000459 00000 n 0000000504 00000 n trailer ]/Info 6 0 R/Size 7>> %iText-5.4.1 startxref 645 %%EOF
有人有善意告诉我出了什么问题吗?
答案 0 :(得分:1)
你应该在设置响应头之前调用document.close(),这里有一个详细的example,它们明确写入servlet的输出流
希望它有所帮助。- [编辑] 我使用itext-2.1.7运行相同的代码,但是使用doGet,对我有用,可能问题是你使用的是使用POST http请求(doPost)的servlet方法,而如果你在服务器中点击基本url直接,这将发送一个GET请求。
您可以覆盖服务方法,也可以从doGet调用doPost,或者从表单或ajax中提交相同的url,以确保http Post调用。
答案 1 :(得分:0)
正如天行者指出的那样,你是直接写回答OutputStream
,你需要在设置响应之前使用中间流(比如他的链接样本中的一个),不要忘记{{1}最后和flush()
它。
此外,通过将内容类型设置为close()
,您告诉浏览器根据需要处理此类流(例如,它可以决定打开pdf,而不是允许您下载它)。为了始终强制浏览器弹出下载对话框,我建议使用application/pdf
内容类型。
答案 2 :(得分:0)
我将帖子REQUEST标题设置为“application / x-www-form-urlencoded”。这不是问题吗?
答案 3 :(得分:0)
我终于使用post方法辞职了。在这种情况下似乎无法使用。谢谢大家的帮助!