2024年4月12日发(作者:)

java web service 大文件上传/下载 DataHandler

2009年08月28日 星期五 16:52

传输小体积文件(不超过10M)通常采用byte[]来容纳数据内容。开发过程中,通常是以下面给出的代码形式来

public byte[] download(String fileName);

public void upload(String fileName, byte[] content);

制内容在网络传输过程中还能以soap附件的形式收发。

本文将要涉及到的内容是:

通过Webservice上载或下载大体积的文件(至少是500M以上)。

采用annotation的注解方式开启webservice的消息传输优化。

使用DataHandler操作输入输出流。

数据内容即以byte[]的方式来容纳。毕竟字节数组的长度是有限的,大体积的数据流显然不适合用如此方式操

知识点

Webservice通过“附件”的形式可把多个二进制内容粘贴到消息的附件部位上。因此在编程的过程中既可以直

MTOM(Message Transmission and Optimization Mechanism)即是进行此项操作的用场。

(使用soap的消息操作API)进行“附件”的读写也能使用客户端存根代码的java代理类进行操作。Web ser

数据内容和JAVA的数据类型

下表列举了在http传输过程中媒体内容的类型和JAVA编程对象的对应关系

MIME Type

Java Type

image/gif

image/jpeg

text/plain

text/xml or applica

tion/xml

*/*

rce

ndler

以图片的内容来解释下传输类型的转换过程:

类型的对象在传输前按照image/gif;image/jpeg的编码规则(HTTP上媒体字节内容的编码规则

中;从soap消息里还原出媒体内容的时候即还原成的对象实例。

*/*这种类型就是“通吃”了,完全依靠DataHandler的实现提供输入输出流来操作媒体内容。这种类型就是本

代码讲解

先来看上载文件的服务端。webservice的实现类用annotation标注以开启MTOM方式

@

public class MTOMServer {

...

}

上载的功能

public void upload(

@WebParam(name="fileName")String fileName,

@XmlMimeType("*/*")

@WebParam(name="fileDataHandler")

DataHandler dataHandler)throws IOException

的附件部位。(如果不明确地进行标记,那么客户端存根代码上就不会出现DataHandler,而是byte[])。

下载的功能

@WebResult

@XmlMimeType("*/*")

public DataHandler download(

@WebParam(name="fileName")String fileName

)throws FileNotFoundException{

用DataHandler充当上载的数据操作的“手柄”,并且明确地使用 @XmlMimeType("*/*")标注以表示采用数据流

同样显示地标注*/*表示客户端将得到DataHandler(如果不明确地进行标记,那么客户端存根代码上就不会出

客户端也能开启MTOM。开启的方式可以在获取服务的时候指出:

public MTOMServerService features)

实参用MTOMFeature的实例。

客户端调用上载方法前还需为请求的上下文环境指定“流操作的块的大小”

Map ctxt = ((BindingProvider)mtomPort).getRequestContext();

(_CLIENT_STREAMING_CHUNK_SIZE, 2048);

以下贴出服务端代码

@

@WebService(name="MTOMServerService",portName="MTOMServer")

public class MTOMServer {

private static final int BUFFER_SIZE = 1024*1024*20;

@Resource

private WebServiceContext serviceContext;

/**

* 下载文件

* @return 数据句柄

*/

@WebResult

@XmlMimeType("*/*")

public DataHandler download(

@WebParam(name="fileName")String fileName)throws FileNotFoundException{

if (fileName==null||y())

throw new FileNotFoundException("file name is empty");

File dir = getFileDepository();

File downloadFile = new File(olutePath()+torChar+fileName);

if (!())