当前位置:  开发笔记 > 编程语言 > 正文

Web服务可以返回流吗?

如何解决《Web服务可以返回流吗?》经验,为你挑选了2个好方法。

我一直在写一个小应用程序,让人们上传和下载文件给我.我已经为这个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服务背后的理论,但实际的一面是我还需要了解一些信息.

为任何输入干杯,李



1> Stephen Denn..:

是的,可以使用Metro.请参阅大型附件示例,它看起来像您想要的那样.

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

在编程模型中使用MTOM和DataHandler.

将DataHandler转换为StreamingDataHandler并使用其方法.

确保调用StreamingDataHandler.close()并关闭StreamingDataHandler.readOnce()流.

在客户端启用HTTP分块.



2> Guvante..:

Stephen Denne的Metro实现可满足您的要求.在简短探讨之后,我的答案将在下面提供.

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

如果你想保持这个,你可以提供分块.

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

如果你没有按照正确的顺序获得块,那么这需要一些步法(或者你可以只需要按正确的顺序排列块),但它可能很容易实现.


从概念上讲,你是对的,但肯定有这种限制的方法(正如@spdenne所提到的).一个好的解决方案是使用MTOM.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有