当前位置: 首页 > 面试题库 >

如何在Java Web应用程序中将byte []作为pdf发送到浏览器?

卫乐童
2023-03-14
问题内容

在行动方法(JSF)中,我有如下内容:

public String getFile() {
  byte[] pdfData = ...
  // how to return byte[] as file to web browser user ?
}

如何将byte []作为pdf发送到浏览器?


问题答案:

在action方法中,您可以通过JSF幕后获得HTTP
servlet响应ExternalContext#getResponse()。然后,您至少需要将HTTP
Content-Type标头设置为application/pdf,并将HTTP Content- Disposition标头设置为attachment(当您要弹出 另存为 对话框时)或将HTTP
标头设置为(当您想让inlineWeb浏览器处理显示本身时)。最后,您需要确保FacesContext#responseComplete()稍后再打电话以避免IllegalStateExceptions飞来飞去。


开球示例:

public void download() throws IOException {
    // Prepare.
    byte[] pdfData = getItSomehow();
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

    // Initialize response.
    response.reset(); // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide.
    response.setContentType("application/pdf"); // Check http://www.iana.org/assignments/media-types for all types. Use if necessary ServletContext#getMimeType() for auto-detection based on filename.
    response.setHeader("Content-disposition", "attachment; filename=\"name.pdf\""); // The Save As popup magic is done here. You can give it any filename you want, this only won't work in MSIE, it will use current request URL as filename instead.

    // Write file to response.
    OutputStream output = response.getOutputStream();
    output.write(pdfData);
    output.close();

    // Inform JSF to not take the response in hands.
    facesContext.responseComplete(); // Important! Else JSF will attempt to render the response which obviously will fail since it's already written with a file and closed.
}

就是说,如果您有可能将PDF内容作为InputStream而不是进行获取byte[],我建议您使用它代替从内存中保存webapp。然后,您只需以众所周知的方式编写它InputStream-
OutputStream循环使用通常的Java IO方法即可。



 类似资料:
  • 问题内容: 在我的Node / Express应用程序中,我有以下代码,假设要从文件中读取PDF文档,并将其发送到浏览器: 我没有收到任何错误,但是我也没有在浏览器中获取文件。我究竟做错了什么? 问题答案: 您必须通过管道从Readable Stream到Writable流,而不是相反: 另外,您以错误的方式设置了编码,如果需要,可以通过编码传递对象。

  • 问题内容: 我正在开发我的第一个Android应用程序。我正在尝试做的是对REST服务的POST请求,我希望此请求的主体为JSON字符串。 我正在使用Google的GSON来生成发送到服务器的JSON。这是执行POST请求的代码: 响应代码为400 BAD REQUEST,我可以从服务器日志中读取信息。尸体未正确发送的地方: 服务器端的代码是一个简单的Seam Rest Service: Andr

  • 问题内容: 我正在为我的应用程序使用烧瓶。我想将图像(由PIL动态生成)发送给客户端,而不保存在磁盘上。 任何想法如何做到这一点? 问题答案: 首先,你可以将映像保存到临时文件并删除本地文件(如果有): 其次,将临时文件设置为响应(根据此stackoverflow问题):

  • 然而,这种方法有几个问题: 它似乎只适用于iPhone而不适用于Android。对于Android,是否有类似的解决方案? 只有在您被重定向到WhatsApp后,它才能选择发送给谁,除非您知道用户的通讯簿ID(=)。第一,我不知道如何访问用户的abid?第二,我正在尝试发送到一个小组,在这种情况下没有abid(对吗?),因此似乎不可能做到这一点。是真的吗?另外,Android应用程序会发生什么呢?

  • 我想实现如下内容: 使用RTSP从IP-Camera读取视频流(已完成) 使用OpenCV处理图像(已完成) 将图像发送到浏览器以显示(这是问题所在) 第三部分利用RTSP协议将图像作为视频流发送。 注意:服务器端使用的语言是Java(OpenCV也在Java中),服务器是Tomcat。 如果有人认为用RTSP来实现不是更好,那么最好的方法是什么来实现这个功能,因为RTSP对于视频流来说是特殊的,

  • 在我的应用程序中,我希望在崩溃时将日志发送到远程服务器。我添加了try-catch块,并在catch中向服务器发送日志。我想知道我应该抓住哪些例外。我需要日志以防每次崩溃,这样我就能修复它。捕捉所有异常是一种好的做法吗? 提前感谢。