使用泽西岛的输入和输出二进制流?

2022-08-31 09:21:59

我正在使用泽西岛来实现一个主要检索和提供JSON编码数据的RESTful API。但是在某些情况下,我需要完成以下操作:

  • 导出可下载的文档,如 PDF、XLS、ZIP 或其他二进制文件。
  • 检索多部分数据,例如一些 JSON 加上上传的 XLS 文件

我有一个基于JQuery的单页Web客户端,它创建对此Web服务的AJAX调用。目前,它不进行表单提交,而是使用GET和POST(带有JSON对象)。我应该使用表单发布来发送数据和附加的二进制文件,还是可以使用 JSON 加二进制文件创建多部分请求?

我的应用程序的服务层当前在生成 PDF 文件时会创建一个 ByteArrayOutputStream。通过泽西岛将此流输出到客户端的最佳方式是什么?我已经创建了一个MessageBodyWriter,但我不知道如何从泽西岛资源使用它。这是正确的方法吗?

我一直在查看泽西岛附带的示例,但还没有找到任何说明如何做到这两点的东西。如果这很重要,我正在使用泽西岛和杰克逊在没有XML步骤的情况下进行Object->JSON,并且我并没有真正使用JAX-RS。


答案 1

我设法通过扩展对象获得了ZIP文件或PDF文件。下面是一些示例代码:StreamingOutput

@Path("PDF-file.pdf/")
@GET
@Produces({"application/pdf"})
public StreamingOutput getPDF() throws Exception {
    return new StreamingOutput() {
        public void write(OutputStream output) throws IOException, WebApplicationException {
            try {
                PDFGenerator generator = new PDFGenerator(getEntity());
                generator.generatePDF(output);
            } catch (Exception e) {
                throw new WebApplicationException(e);
            }
        }
    };
}

PDFGenerator 类(我自己的用于创建 PDF 的类)从写入方法获取输出流并写入该输出流,而不是新创建的输出流。

不知道这是否是最好的方法,但它有效。


答案 2

我不得不返回一个rtf文件,这对我有用。

// create a byte array of the file in correct format
byte[] docStream = createDoc(fragments); 

return Response
            .ok(docStream, MediaType.APPLICATION_OCTET_STREAM)
            .header("content-disposition","attachment; filename = doc.rtf")
            .build();

推荐