`
wxb_love
  • 浏览: 95939 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多
  java web service 大文件上传/下载 DataHandler【转帖】 收藏
传输小体积文件(不超过10M)通常采用byte[]来容纳数据内容。开发过程中,通常是以下面给出的代码形式来定义数据类型:






public byte[] download(String fileName);

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





数据内容即以byte[]的方式来容纳。毕竟字节数组的长度是有限的,大体积的数据流显然不适合用如此方式操作。webservice规范中指出:二进制内容在网络传输过程中还能以soap附件的形式收发。





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



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

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

    使用DataHandler操作输入输出流。



知识点
Webservice通过“附件”的形式可把多个二进制内容粘贴到消息的附件部位上。因此在编程的过程中既可以直接操纵webservice的原始消息内容(使用soap的消息操作API)进行“附件”的读写也能使用客户端存根代码的java代理类进行操作。Web service规范中的一项:MTOM(Message Transmission and Optimization Mechanism)即是进行此项操作的用场。






数据内容和JAVA的数据类型



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

MIME Type
Java Type

image/gif
java.awt.Image

image/jpeg
java.awt.Image

text/plain
java.lang.String

text/xml or application/xml
javax.xml.transform.Source

*/*
javax.activation.DataHandler







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

java.awt.Image类型的对象在传输前按照image/gif;image/jpeg的编码规则(HTTP上媒体字节内容的编码规则)进行编码,而后写到soap消息中;从soap消息里还原出媒体内容的时候即还原成java.awt.Image的对象实例。



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



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

@javax.xml.ws.soap.MTOM

public class MTOMServer {

...

}



上载的功能

public void upload(

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



        @XmlMimeType("*/*")

        @WebParam(name="fileDataHandler")

        DataHandler dataHandler)throws IOException



用DataHandler充当上载的数据操作的“手柄”,并且明确地使用 @XmlMimeType("*/*")标注以表示采用数据流的方式把媒体内容写到SOAP消息的附件部位。(如果不明确地进行标记,那么客户端存根代码上就不会出现DataHandler,而是byte[])。



下载的功能

@WebResult

@XmlMimeType("*/*")

public DataHandler download(

        @WebParam(name="fileName")String fileName

)throws FileNotFoundException{

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








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

public MTOMServerService getMTOMServer(WebServiceFeature... features)

实参用MTOMFeature的实例。



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

Map<String, Object> ctxt = ((BindingProvider)mtomPort).getRequestContext();

ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 2048);





以下贴出服务端代码

@javax.xml.ws.soap.MTOM
@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||fileName.isEmpty())
throw new FileNotFoundException("file name is empty");

File dir = getFileDepository();
File downloadFile = new File(dir.getAbsolutePath()+File.separatorChar+fileName);
if (!downloadFile.exists())
throw new FileNotFoundException(fileName + " does not exist");

return new DataHandler(
new FileDataSource(downloadFile){
public String getContentType() {
return "application/octet-stream";
}
}
);
}

@WebResult
@XmlMimeType("*/*")
public DataHandler[] downloadMulti()throws FileNotFoundException{
final File[] files = getFileDepository().listFiles();
DataHandler[] handlers = new DataHandler[files.length];

for (int i = 0,j=files.length; i < j; i++){
final String fileName = files[i].getName();
handlers[i]=
new DataHandler(new FileDataSource(files[i])){
public String getName() {return fileName;}
};
}
return handlers;
}


/**
* 上载
* @param fileName 待上载的文件名
* @param dataHandler 数据句柄
* @throws IOException IO异常
*/
public void upload(
@WebParam(name="fileName")String fileName,

@XmlMimeType("*/*")
@WebParam(name="fileDataHandler")
DataHandler dataHandler)throws IOException{

File depository = getFileDepository();

InputStream in = dataHandler.getInputStream();
OutputStream out = new FileOutputStream(depository.getAbsolutePath()+File.separatorChar+fileName);

byte[] buf = new byte[BUFFER_SIZE];
int read;
while( (read=in.read(buf))!=-1 ) {
out.write(buf,0,read);
out.flush();
}
in.close();
out.close();
}

/**
* 列表文件清单
* @return 文件清单
*/
public java.util.List<FileDescription> listFiles(){
File fileDepository = getFileDepository();
java.util.List<FileDescription>L=new java.util.ArrayList<FileDescription>(0);

for (File f : fileDepository.listFiles()) {

FileDescription fds = new FileDescription();


Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(f.lastModified());

fds.setModifiedDate(cal);
fds.setFileName(f.getName());
fds.setLength(f.length());
L.add(fds);
}

return L;
}

/**
* 获取临时上载文件的路径
* @return 临时文件路径
*/
private static File getFileDepository(){
return new File(System.getProperty("java.io.tmpdir"));
}
}









客户端代码



class FileClient {
final static private int CHUNK_SIZE = 1024*1024*300;
final static private SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static void main(String[] args) throws MalformedURLException, IOException_Exception {

URL url = new URL(args[0]);
QName qname = new QName("http://mtom/", "MTOMServerService");
MTOMServerService_Service service = new MTOMServerService_Service(url,qname);

MTOMFeature feature = new MTOMFeature();
MTOMServerService mtomPort = service.getMTOMServer(feature);

//列文件清单
for(FileDescription fds : mtomPort.listFiles()){
System.out.println("file Name : "+fds.getFileName());
System.out.println("file size : "+fds.getLength());

Date date = fds.getModifiedDate().toGregorianCalendar().getTime();
System.out.println("last date : "+ DATEFORMAT.format(date));
System.out.println("___________________________________________");
}


//上载文件
if(args.length<2){
System.err.println("no file to be upload.");
System.err.println("set the file path on the command line for the second argument\ne.g\nFileClient [wsdl-url] [full path]");
}
else{
Map<String, Object> ctxt = ((BindingProvider)mtomPort).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, CHUNK_SIZE);
File uploadFile = new File(args[1]);
FileDataSource fileDataSource = new FileDataSource(uploadFile);
DataHandler dataHandler = new DataHandler(fileDataSource);
mtomPort.upload(uploadFile.getName(),dataHandler);
}

//下载指定的单个文件
//try {
//    final String fileName = "深海圆疑.rmvb";
//    OutputStream fileOut = new FileOutputStream(fileName);
//
//    DataHandler downloadHandler = mtomPort.download(fileName);
//    InputStream fileIn = downloadHandler.getInputStream();
//    byte[] buf = new byte[CHUNK_SIZE];
//    int read;
//    while (-1 != (read = fileIn.read(buf))) {
//        fileOut.write(buf,0,read);
//        fileOut.flush();
//    }
//    fileIn.close();
//    fileOut.close();
//} catch(FileNotFoundException_Exception e) {
//    e.printStackTrace();
//} catch(IOException e) {
//    e.printStackTrace();
//}

//下载全部文件
try {
List<DataHandler> dataHandlers = mtomPort.downloadMulti();
byte[] buf = new byte[CHUNK_SIZE];
for (int i = 0,j=dataHandlers.size(); i <j;i++) {
DataHandler handler = dataHandlers.get(i);
String fileName = handler.getName();
fileName = fileName==null||fileName.isEmpty()?Integer.toString(i):fileName;
InputStream in = handler.getInputStream();
OutputStream out=new FileOutputStream(fileName);

int read;
while((read=in.read(buf))!=-1){
out.write(buf,0,read);
out.flush();
}
in.close();out.close();

}
} catch(FileNotFoundException_Exception e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}

}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linfen1680/archive/2010/07/11/5727570.aspx
分享到:
评论
1 楼 xiexiaoming052 2012-10-14  
写的非常的详细,具有很好的参考价值!

相关推荐

    javaweb service大文件上传下载 DataHandler.docx

    Java Web Service 大文件上传下载通常涉及到处理大量数据,尤其是对于超过10MB的大文件,直接使用`byte[]`数组存储并不合适,因为这可能导致内存溢出。在这种情况下,可以利用`DataHandler`类和MTOM(Message ...

    cxf客户端(对象,上传与下载文件支持断点传输)

    本示例着重于CXF客户端如何处理对象参数传递以及支持文件的上传和下载,特别是实现了断点续传功能,这在大文件传输时尤为关键。 【对象传参】: CXF允许通过JAXB(Java Architecture for XML Binding)将Java对象...

    webservice4 二进制文件读取

    然而,这种方式可能会遇到内存管理和性能问题,因为大文件可能会消耗大量内存。 另一种方法是使用`javax.activation.DataHandler`类。`DataHandler`是Java标准API的一部分,专门用于处理Web服务中的二进制数据。它...

    基于web service技术的新华书店销售分析系统的设计与实现(doc 6页).docx

    配置文件中包含了服务的Java类路径和其他必要的依赖库,如axis.jar、jaxrpc.jar等,这些库提供了Web Service的实现基础。 在数据持久层,系统选择了Hibernate框架。Hibernate是一个流行的对象关系映射(ORM)工具,...

    DataHander.rar_axis datahand_web service _webservice

    标题 "DataHandler.rar_axis datahand_web service _webservice" 暗示了这是一个关于使用Axis框架来处理Web服务的项目,其中可能包含了客户端和服务端的数据处理组件。描述中提到的"webservices附件传输"指的是通过...

    datahandler.rar

    本文将探讨“datahandler”这一Java工具,它提供了一种类似BeanUtils.copyProperties的功能,但更加强大,能够处理不同类型的字段转换,为业务代码的解耦提供了有力支持。 首先,我们要理解Java中的BeanUtils....

    WebService大讲堂之Axis2(4):二进制文件传输.pdf

    在本文中,我们将讨论如何使用 Axis2 实现二进制文件传输,包括使用 byte[] 类型参数和使用 javax.activation.DataHandler 类型参数上传二进制文件。 使用 byte[] 类型参数上传二进制文件 在Axis2 中,我们可以...

    java将mht转化为html

    本文将深入探讨如何使用Java将MHT(MHTML或Web档案单个文件)转换为HTML,并重点讲解代码实现过程中的关键技术点。 #### 一、MHT与HTML简介 1. **MHT (MHTML)**:是一种将网页的所有组成部分(如HTML代码、图片、...

    WebService CXF --- 传输文件MTOM

    在"WebService CXF --- 传输文件MTOM"这个主题中,我们将深入探讨CXF框架如何利用Message Transmission Optimization Mechanism (MTOM)高效地传输大文件。 MTOM是W3C制定的一种优化Web服务消息传输的技术,特别适用...

    axis_讲解 java

    Axis 是 Apache 组织提供的一款开源的 Web 服务框架,主要用于实现 SOAP 协议下的 Web 服务,它能够帮助开发者快速地开发、部署和调用基于 Java 的 Web 服务。 #### 1.2 Axis 特点 - **简单易用**:Axis 提供了简洁...

    java 发邮件带excel附件,以流的形式发送附件,不生成excel文件

    在Java编程中,发送带有Excel附件的电子邮件是一项常见的任务,特别是在数据报告或自动化流程中。在某些场景下,我们可能希望直接以流的形式处理Excel数据,而不是先将其保存为一个实际的文件,然后再作为附件发送。...

    axis2_demo实战 复杂对象传输 文件传输

    在Web服务上下文中,DataHandler允许我们方便地上传、下载和处理文件,而无需直接处理文件流。 在"标签"中提到了"datahander",这是处理文件传输的关键。DataHandler可以与Servlet一起工作,用于处理HTTP请求中的...

    CXF3.0+Spring3.2 传输文件

    对于大文件,可能需要考虑流式传输以减少内存消耗。 3. **使用Spring管理CXF**:通过Spring的`&lt;cxf:bus&gt;`和`&lt;cxf:service&gt;`标签,可以将CXF服务注册到Spring容器中。这样,你可以利用Spring的依赖注入特性,将其他...

    带附件的webservice

    ### 带附件的Webservice知识点详解 #### 一、Webservice简介与概念 Web服务是一种跨编程语言和操作系统平台的、通过网络提供服务的...这些技术在实际开发中非常有用,尤其是在需要处理大量文件上传下载的应用场景中。

    saaj访问web服务

    ### 使用SAAJ访问Web服务及文件上传的知识点 #### 一、SAAJ概述 SAAJ (SOAP with Attachments API for Java) 是一个重要的Java API,主要用于处理SOAP消息,特别是那些带有附件的消息。它是由JCP (Java Community ...

    javax.activation.jar

    javax.activation.jar 是一个Java平台上的库,主要用于支持数据对象的激活和处理,它是JavaMail项目的一部分,但也可以单独使用。这个库提供了数据处理和传输的标准API,使得开发者能够在不同的应用程序和环境中交换...

    Java Web应用开发 56 课堂案例-应用JavaMail组件发送邮件.docx

    ### Java Web应用开发 56 课堂案例-应用JavaMail组件发送邮件 #### 案例背景与目标 本案例旨在通过实际操作帮助学生掌握如何利用JavaMail组件在Java Web应用中实现邮件发送功能。JavaMail是Java平台的一个扩展,...

    springboot+webservice+cxf

    此外,CXF还支持MTOM(Message Transmission Optimization Mechanism)和SwA(Swapped Attachments)来处理大文件上传和下载。 对于文件上传,CXF提供了`Attachment`接口来处理多部分HTTP请求。以下是一个简单的...

    基于spring+cxf实现用户文件传输的webservice

    首先,我们需要定义Webservice输入输出的数据类型,主要包括报文名称、报文类型、报文发送时间以及处理文件流的DataHandler属性。 在定义好输入输出的数据结构后,我们可以定义要提供的业务服务接口。在该接口中,...

    Jquery调用ashx

    在Web开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理和Ajax交互。而ASHX(HTTP Handler)是ASP.NET框架中的一种轻量级的处理程序,用于处理HTTP请求。本篇文章将深入探讨如何使用...

Global site tag (gtag.js) - Google Analytics