我是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
有没有人好心告诉我出了什么事?
我将post请求头设置为“application/x-www-form-urlencoded”。这不是个问题吗?
正如天行者所指出的,您直接向响应OutputStream
,在设置响应之前,您需要使用一个中间流(就像他链接的示例中的a),并且最后不要忘记对其进行flush()
和close()
操作。
此外,通过将内容类型设置为Application/pdf
,您告诉浏览器处理它想要的流(例如,它可以决定打开pdf,而不是允许您下载它)。为了始终强制浏览器弹出下载对话框,我建议使用应用程序/八位流内容类型。
在设置响应头之前,您应该调用document.close(),这里有一个详细的例子,它们显式地写入servlet的输出流
希望能有帮助。
--[编辑]我在itext-2.1.7中运行了与上述相同的代码,但在doGet中对我有效,可能问题在于您使用的是使用POST http请求(doPost)的servlet方法,而如果您直接在服务器中点击基本url,则会发送GET请求。
您可以重写服务方法,或者从doget调用doPost,或者从表单或ajax提交相同的url,以确保超文本传输协议Post调用。
问题内容: 鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。 我的angular 1.5.X客户端为我提供了标题列表,每个标题都有一个关联的文件。我的Node 4.X / Express 4.X服务器使用该列表,获取文件位置,使用npm中的express-zip创建一个zip文件,然后将该文件流式传输回响应中。然后,我希望我的客户端启动浏览器的“下载文件”选项。 这是我的客户代码
在有人说“重复”之前,我只想确保大家知道,我已经回顾了这些问题: 1) 使用angular和php,不确定这里发生了什么(我不知道php):下载zip文件并从angular方法触发“保存文件”对话框 2) 什么都做不到:如何使用angular下载zip文件 3) 这个人已经可以下载了,这已经超过了我想弄明白的点:从一个按钮动作触发的角度下载外部zip文件 4) 这个问题没有答案:下载。nodejs
问题内容: 我有一个导出功能,可以读取整个数据库并使用所有记录创建一个.xls文件。然后将文件发送到客户端。 当然,导出完整数据库的时间需要很多时间,并且该请求很快会因超时错误而结束。 处理这种情况的最佳解决方案是什么? 例如,我听说过有关使用Redis进行队列的操作,但这需要两个请求:一个用于启动将生成文件的作业,第二个用于下载生成的文件。 来自客户端的单个请求是否可能? 问题答案: Excel
我有一个这样的歌剧API: OpenAPI生成器Maven的插件为schema对象创建了一个请求类“GenerateTokenRequest”,但在API实现类中它没有使用。它生成一个方法,将所有请求的字段作为参数列表。方法如下: 所以,在这种情况下,请求类“GenerateTokenRequest”被生成,但从未使用过。任何人都可以告诉我为什么?有一种使用我的请求类的替代方法吗?我可以在Open
嗯,首先,对不起我的英语不好。 “enderecodao.java”: 和ENDERECO的WebService“servicoEnderEco.java”:
我有一个WildFly集群,它应该将所有主题消息共享给不同的节点,并在一个节点离线时保存它们。< br >在这种情况下,我需要耐用的订阅服务器。 我注意到如果我使用相同的clientID,系统会进行负载平衡。如果我将clientID或认购名称更改为唯一值,它就可以工作。 那么什么时候使用唯一的clientID,什么时候使用subscriptionName 我的答案是,每个节点的唯一clientID