使用 Java Jersey 返回文件

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

见***.com/questions/3496209/…,这个答案也有用。 【参考方案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 并传递它们进入泽西岛的响应生成器。 不过我自己还没有这样做..

在这里查看:

JDBC's getBinaryStream()

An example

【讨论】:

以上是关于使用 Java Jersey 返回文件的主要内容,如果未能解决你的问题,请参考以下文章

Java Atmosphere Jersey 从可广播返回 JSON 对象

Jersey REST get 返回 java.lang.NoSuchMethodError

如何在 Jersey 2.x 中返回对象

Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面

Jersey:是不是可以覆盖 Jersey filter() 的返回类型?

自定义响应头 Jersey/Java