Web 服务是否可以返回流?

2022-09-01 14:39:52

我一直在写一个小应用程序,让人们上传和下载文件给我。我已经向此应用程序添加了一个Web服务,以以这种方式提供上传/下载功能,但我不太确定我的实现将如何应对大文件。

目前,上传和下载方法的定义如下所示(使用Apache CXF编写):

boolean uploadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename,
    @WebParam(name = "fileContents") byte[] fileContents)
    throws UploadException, LoginException;

byte[] downloadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename) throws DownloadException,
    LoginException;

因此,文件将作为字节数组上传和下载。但是,如果我有一个愚蠢大小的文件(例如1GB),这肯定会尝试将所有信息放入内存中并使我的服务崩溃。

所以我的问题是 - 是否可以返回某种流?不过,我想这不会是独立于操作系统的。虽然我知道Web服务背后的理论,但实际的方面是我仍然需要学习一些信息的东西。

为任何输入干杯,李


答案 1

是的,使用地铁是可能的。请参阅“大型附件”示例,该示例看起来可以执行所需的操作。

JAX-WS RI 支持以流方式发送和接收大型附件。

  • 在编程模型中使用 MTOM 和 DataHandler。
  • 将数据处理程序转换为流式处理数据处理程序并使用其方法。
  • 确保调用 StreamingDataHandler.close() 并关闭 StreamingDataHandler.readOnce() 流。
  • 在客户端启用 HTTP 分块。

答案 2

Stephen Denne 有一个 Metro 实现可以满足您的要求。在简短阐述了为什么会这样之后,我的答案在下面提供。

大多数使用 HTTP 作为消息协议构建的 Web 服务实现都符合 REST 标准,因为它们只允许简单的发送-接收模式,仅此而已。这大大提高了互操作性,因为所有各种平台都可以理解这种简单的体系结构(例如,Java Web服务与.NET Web服务通信)。

如果你想保持这一点,你可以提供分块。

boolean uploadFile(String username, String password, String fileName, int currentChunk, int totalChunks, byte[] chunk);

如果您没有以正确的顺序获得块(或者您可以只要求块以正确的顺序出现),这将需要一些步法,但它可能很容易实现。


推荐