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

2024-03-10

在操作方法(JSF)中,我有如下内容:

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

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


在操作方法中,您可以通过以下方式从 JSF 底层获取 HTTP servlet 响应:ExternalContext#getResponse() http://java.sun.com/javaee/5/docs/api/javax/faces/context/ExternalContext.html#getResponse%28%29。那么你至少需要设置HTTPContent-Type标头至application/pdf和 HTTPContent-Disposition标头至attachment(当你想弹出一个Save As对话)或inline(当您想让网络浏览器自行处理显示时)。最后,您需要确保您调用FacesContext#responseComplete() http://java.sun.com/javaee/5/docs/api/javax/faces/context/FacesContext.html#responseComplete()之后避免IllegalStateException飞来飞去。

开球示例:

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[],我建议使用它来避免 web 应用程序占用大量内存。然后你只需将其写在众所周知的InputStream-OutputStream循环通常的 Java IO 方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java web应用程序中将byte[]作为pdf发送到浏览器? 的相关文章

随机推荐

  • EF 4.1 Code First 和现有数据库以及 .NET 成员资格

    我的开发盒上有一个名为 ApplicationName Development 的数据库在 SQL Server 2008 R2 Developer 版本上运行 我将 NET 成员资格表添加到数据库中没有任何问题 当我尝试让 Code Fi
  • 我想删除 HTML 空白

    我有一个新问题困扰着我 我正在制作一个网页 我希望在不滚动的情况下进行修复 最重要的是我希望我的主 Div 填满我的所有可用空间 我做了这个代码
  • 是否允许类型相同但大小不同的双关数组?

    类型相同但大小不同的双关数组仍然违反严格别名吗 int arr 4 int ref 2 reinterpret cast
  • xcode 5 中的 Shell 脚本调用错误

    我在我的项目中使用 openssl 和 sqlcipher 我必须从 Xcode 4 6 升级到 Xcode 5 但是我在 Xcode 5 中编译项目 它给我错误 cp libCrypto a 没有这样的文件或目录 Cp libssl a
  • 用于匹配捕获组中前面或后面的字母字符的正则表达式

    举例来说 我有以下数据 ab cd ef zy ba cd 我希望能够以匹配第一个字符的方式来匹配它 然后根据第一个字符的捕获组匹配第二个字符 上面示例中的每一行都应该匹配 而类似cc or af不应该 详细来说 我的想法看起来像这样 基于
  • HTML img src 返回 404 未找到错误,尽管一切正常

    这是一件令人困惑的事情 首先看我的文件夹的层次结构等 https i stack imgur com b5U8a png并看到图像文件夹下有我的图像 cribbage png 我正在尝试使用 index html 中的以下代码访问此图像 h
  • 在 PostgreSQL 中连接

    我有一个带有宽度和高度 均为整数 的表格 我想按原样显示它 例如 宽度 300 高度 160 面积 300 x 160 我正在使用以下查询 select cast concat width x height as varchar 20 fr
  • 云形成的秘密

    我想坚持 所有基础设施都是代码 的政策 但是 我看不到使用 CloudFormation 来实现机密的方法 SecretsManager 要求您以纯文本形式指定 SecretString 即使您从某处注入解密的值 纯文本字符串也会显示在 C
  • NSIS - 检查注册表项值是否存在

    我需要检查注册表值是否存在 我怎样才能做到这一点 我的第一个方法 ReadRegStr 0 HKLM SOFTWARE Microsoft Windows NT CurrentVersion Ports NUL IF 0 MESSAGEBO
  • Pandas:“item”已被弃用

    到目前为止 我在这里使用了这行代码 max total gross event data max total gross loc event data event id event id item 自从我更新了 Pandas 后 我收到了未
  • MSBuild / Visual Studio 分布式构建

    我开发 维护一个需要很长时间才能构建的应用程序 例如 完整的构建需要超过六个小时 在花了一天的大部分时间构建我们的应用程序之后 我开始研究改进构建时间的方法 建议关于这个堆栈溢出问题 https stackoverflow com ques
  • JavaFX:在拖放过程中更改光标

    我试图在拖放过程中更改节点上的光标 但图像没有改变 我正在打电话setCursor in the DragDetectedEventHandler我的节点 我也尝试过打电话getParent setCursor 并得到相同的结果 我还尝试在
  • 未定义行为 (UB) 以实现余地为条件的程序是具有无条件 UB 的程序吗?

    在回答中 在 C 20 中使用 std bit cast 创建闭包 lambda 对象是否有效 https stackoverflow com questions 68828838 is it valid to create closure
  • Silverstripe 后端发生奇怪的行为?

    突然间 每当我尝试单击 silverstripe 后端中的页面时 它最初会显示如下 我正在运行 SS 3 2 当这种情况开始发生时 我升级到 3 2 1 看看是否可以解决问题 但不行 有时它也会显示此错误消息 User Warning Co
  • RecyclerView重叠无阴影

    我想开发像这张图这样的List 我曾经使用 RecyclerView ItemDecoration 进行重叠 但它是重叠的 没有阴影 屏幕和装饰器代码如下 public class OverlapDecoration extends Rec
  • 如何在html5视频上移动svg元素并同时控制视频播放?

  • 双花括号 ({{) 在 YAML 文件(Ansible 使用的)中意味着什么?

    我对 Ansible 相当陌生 并试图理解 YAML 文件 因为我不清楚这条线 file dest docroot 有人可以解释一下那些大括号 是做什么的吗 name Create Web Root when nginxinstalled
  • c++如何写构造函数?

    我不习惯 C 并且在编写构造函数时遇到问题 请参阅此示例 是我正在处理的代码的简短版本 class B public B int x class A public B b A here I have to initialize b 这会引发
  • 获取 SvelteKit 端点请求的原始正文

    我的 SvelteKit 应用程序中有一个端点 用于处理来自 Stripe 的 Webhook 请求 每个请求都经过签名 以便可以验证它是否来自 Stripe 我必须验证该事件是否来自 Stripe 的代码如下所示 import Strip
  • 如何在java web应用程序中将byte[]作为pdf发送到浏览器?

    在操作方法 JSF 中 我有如下内容 public String getFile byte pdfData how to return byte as file to web browser user 如何将 byte 作为 pdf 发送到