我一直在写一个小应用程序,让人们上传和下载文件给我.我已经为这个applciation添加了一个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服务背后的理论,但实际的一面是我还需要了解一些信息.
为任何输入干杯,李
是的,可以使用Metro.请参阅大型附件示例,它看起来像您想要的那样.
JAX-WS RI支持以流方式发送和接收大型附件.
在编程模型中使用MTOM和DataHandler.
将DataHandler转换为StreamingDataHandler并使用其方法.
确保调用StreamingDataHandler.close()并关闭StreamingDataHandler.readOnce()流.
在客户端启用HTTP分块.
Stephen Denne的Metro实现可满足您的要求.在简短探讨之后,我的答案将在下面提供.
使用HTTP作为消息协议构建的大多数Web服务实现都符合REST,因为它们只允许简单的发送 - 接收模式,仅此而已.这极大地提高了互操作性,因为所有各种平台都可以理解这种简单的体系结构(例如,与Web Web服务通信的Java Web服务).
如果你想保持这个,你可以提供分块.
boolean uploadFile(String username, String password, String fileName, int currentChunk, int totalChunks, byte[] chunk);
如果你没有按照正确的顺序获得块,那么这需要一些步法(或者你可以只需要按正确的顺序排列块),但它可能很容易实现.