我正在使用Jersey实现一个主要检索和提供JSON编码数据的RESTful API . 但我有一些情况需要完成以下事项:
-
导出可下载的文档,例如PDF,XLS,ZIP或其他二进制文件 .
-
检索多部分数据,例如一些JSON加上传的XLS文件
我有一个基于JQuery的单页Web客户端,它可以为这个Web服务创建AJAX调用 . 目前,它不进行表单提交,并使用GET和POST(使用JSON对象) . 我应该使用表单发送数据和附加的二进制文件,还是可以使用JSON plus二进制文件创建多部分请求?
我的应用程序的服务层当前在生成PDF文件时创建ByteArrayOutputStream . 通过Jersey将此流输出到客户端的最佳方法是什么?我已经创建了一个MessageBodyWriter,但我不知道如何从Jersey资源中使用它 . 这是正确的方法吗?
我一直在查看 Jersey 附带的样本,但还没有找到任何说明如何做这些事情的东西 . 如果重要的是,我正在使用泽西与 Jackson 做没有XML步骤的对象 - > JSON,并没有真正使用JAX-RS .
10 回答
我设法通过扩展
StreamingOutput
对象来获取ZIP文件或PDF文件 . 以下是一些示例代码:PDFGenerator类(我自己的用于创建PDF的类)从write方法获取输出流并写入而不是新创建的输出流 .
不知道这是否是最佳方式,但它确实有效 .
我不得不返回一个rtf文件,这对我有用 .
我正在使用此代码将excel(xlsx)文件(Apache Poi)作为附件导出 .
这里's another example. I' m通过
ByteArrayOutputStream
创建QRCode作为PNG . 资源返回Response
对象,流的数据是实体 .为了说明响应代码处理,我添加了缓存头的处理(
If-modified-since
,If-none-matches
等) .请不要打扰我,以防万一
stream.toByteArray()
是一个无记忆明智:)它适用于我的<1KB PNG文件......我一直在通过以下方式编写Jersey 1.17服务:
FileStreamingOutput
GET
和客户,如果你需要它:
Client
此示例显示如何通过rest资源在JBoss中发布日志文件 . 请注意,get方法使用StreamingOutput接口来流式传输日志文件的内容 .
}
使用Jersey 2.16文件下载非常简单 .
以下是ZIP文件的示例
我发现以下内容对我有帮助,我希望分享以防万一它可以帮助您或其他人 . 我想要像MediaType.PDF_TYPE这样的东西,它不存在,但是这段代码做了同样的事情:
见http://jersey.java.net/nonav/apidocs/1.1.0-ea/contribs/jersey-multipart/com/sun/jersey/multipart/file/DefaultMediaTypePredictor.CommonMediaTypes.html
就我而言,我将PDF文档发布到另一个站点:
然后p作为第二个参数传递给post() .
此链接对我将此代码段放在一起很有帮助:http://jersey.576304.n2.nabble.com/Multipart-Post-td4252846.html
这对我工作正常url:http://example.com/rest/muqsith/get-file?filePath=C:\ Users \ I066807 \ Desktop \ test.xml
另一个示例代码,您可以将文件上载到REST服务,REST服务压缩文件,客户端从服务器下载zip文件 . 这是使用Jersey使用二进制输入和输出流的一个很好的例子 .
https://stackoverflow.com/a/32253028/15789
这个答案是我在另一个帖子中发布的 . 希望这可以帮助 .