一尘不染

Web服务可以返回流吗?

java

我一直在写一个小应用程序,使人们可以向我上传和下载文件。我已在此应用程序中添加了一个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),那肯定会尝试将所有信息放入内存,并导致我的服务崩溃。

所以我的问题是-是否可以返回某种流?我可以想象这将不会完全独立于OS。尽管我了解Web服务背后的理论,但实际方面仍然是我需要了解的一些信息。

为任何意见加油,李


阅读 223

收藏
2020-12-03

共1个答案

一尘不染

StephenDenne)的Metro实施可以满足您的要求。在简短解释之后,下面提供了我的答案。

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

如果要保持此状态,可以提供分块。

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

如果您没有以正确的顺序获取块(或者您可以只要求以正确的顺序来获取块),这将需要一些工作量,但是它可能很容易实现。

2020-12-03