使用Java Jersey返回一个文件

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

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

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

有没有办法在不完全从db下载数据的情况下开始提供文件,但是数据来自db会将其附加到输出流?

使用JERSEY使用输入和输出二进制流的答案解决了这个问题?

怎么样

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

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

这看起来非常简单,但更重要的是,阅读此内容的java专家是否会看到解决方案的性能问题?

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

我不确定它是否可能。

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

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

点击这里:

  • JDBC的getBinaryStream()

  • 一个例子