【问题标题】:Return a file using Java Jersey使用 Java Jersey 返回文件
【发布时间】:2011-04-23 11:18:44
【问题描述】:

我正在使用 Java Jersey 来实现 REST 服务。 我的服务应该提供的一件事是文件下载选项。 这些文件很大,是由 db 中的数据构成的。

目前我正在从数据库中获取所有数据并将其保存到文件中 并返回一个

Response.ok().entity(new FileInputStream(file)).build();

有没有一种方法可以在不从 db 完全下载数据的情况下开始提供文件,但是由于数据来自 db,所以将其附加到输出流中?

【问题讨论】:

标签: java jersey


【解决方案1】:

怎么样

File fileToSend = getFile();
return Response.ok(fileToSend, "application/zip").build();

可以设置媒体类型以匹配正在发送的文件。

这看起来很简单,但更重要的是,阅读本文的 Java 专家是否发现该解决方案存在性能问题?

【讨论】:

  • 你真的试过这个吗?我希望这只会将文件名作为字符串返回,而不是文件的内容......
  • 对我来说没有,它确实返回了文件名。
【解决方案2】:

使用Input and Output binary streams using JERSEY?的答案解决了问题

【讨论】:

    【解决方案3】:

    所以你想从你的数据库中获取一个流?

    我不确定这是否可能。

    但您不必编写临时文件来发送数据。您可以使用ByteArrayInputStream 并将您的数据与字节数组一起放在那里,而不是写入文件。

    【讨论】:

    • 是的,我想要类似 new InputStream(new MyDBWrapper()) 的东西,MyDBWrapper 将在其中执行数据获取和格式化。我不确定是否可以使用 ByteInputStream,因为数据非常大 - 可以超过 1 GB。
    【解决方案4】:

    取决于底层数据库连接/驱动程序的类型,如果您可以访问 JDBC 层(例如使用 Hibernate),则应该可以使用 JDBC Streaming API 流式传输数据,然后从 ResultSet 中获取 Streams 并传递它们进入泽西岛的响应生成器。 不过我自己还没有这样做..

    在这里查看:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多