zoukankan      html  css  js  c++  java
  • WebService大讲堂之Axis2(4):二进制文件传输

    在《WebService大讲堂之Axis2(2):复合类型数据的传递》中讲过,如果要传递二进制文件(如图像、音频文件等),可以使用byte[]作为数据类型进行传递,然后客户端使用RPC方式进行调用。这样做只是其中的一种方法,除此之外,在客户端还可以使用wsdl2java命令生成相应的stub类来调用WebServicewsdl2java命令的用法详见《WebService大讲堂之Axis2(1):用POJO实现0配置的WebService》。
        WebService类中包含byte[]类型参数的方法在wsdl2java生成的stub类中对应的数据类型不再是byte[]类型,而是javax.activation.DataHandlerDataHandler类是专门用来映射WebService二进制类型的。
        在
    WebService类中除了可以使用byte[]作为传输二进制的数据类型外,也可以使用javax.activation.DataHandler作为数据类型。 不管是使用byte[],还是使用javax.activation.DataHandler作为WebService方法的数据类型,使用wsdl2java命令生成的stub类中相应方法的类型都是javax.activation.DataHandler。而象使用.netdelphi生成的stub类的相应方法类型都是byte[]。这是由于javax.activation.DataHandler类是Java特有的,对于其他语言和技术来说,并不认识javax.activation.DataHandler类,因此,也只有使用最原始的byte[]了。
        下面是一个上传二进制文件的例子,
    WebService类的代码如下:

    package service;

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.FileOutputStream;
    import javax.activation.DataHandler;

    public class FileService
    {
       
    //  使用byte[]类型参数上传二进制文件
        public boolean uploadWithByte(byte[] file, String filename)
        {
             FileOutputStream fos 
    = null;
             
    try
             {                          
                 fos 
    = new FileOutputStream(filename);    
                 fos.write(file);
                 fos.close();
             }
             
    catch (Exception e)
             {
                 
    return false;
             }
             
    finally
             {
                 
    if (fos != null)
                 {
                     
    try
                     {
                         fos.close();
                     }
                     
    catch (Exception e)
                     {
                     }
                 }
             }
             
    return true;
        }
        
    private void writeInputStreamToFile(InputStream is, OutputStream os) throws Exception
        {
             
    int n = 0;
             
    byte[] buffer = new byte[8192];
             
    while((n = is.read(buffer)) > 0)
             {
                 os.write(buffer, 
    0, n);
             }
        }
        
    //  使用DataHandler类型参数上传文件
        public boolean uploadWithDataHandler(DataHandler file, String filename)
        {
            
             FileOutputStream fos 
    = null;
             
    try
             {            
                 fos 
    = new FileOutputStream(filename);   
                 
    //  可通过DataHandler类的getInputStream方法读取上传数据
                 writeInputStreamToFile(file.getInputStream(), fos);
                 fos.close();
             }
             
    catch (Exception e)
             {
                 
    return false;
             }
             
    finally
             {
                 
    if (fos != null)
                 {
                     
    try
                     {
                         fos.close();
                     }
                     
    catch (Exception e)
                     {
                     }
                 }
             }
             
    return true;
        }
    }

     

    上面代码在services.xml文件的配置代码如下:

    <service name="fileService">
        
    <description>
            文件服务
        
    </description>
        
    <parameter name="ServiceClass">
            service.FileService 
        
    </parameter>
            
    <messageReceivers>
            
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class
    ="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        
    </messageReceivers>
    </service>


        如果使用
    wsdl2java命令生成调用Java客户端代码,则需要创建DataHandler类的对象实例,代码如下:

    DataHandler dh = new DataHandler(new FileDataSource(imagePath));

     

    wsdl2java命令会为每一个方法生成一个封装方法参数的类,类名为方法名(第一个字符大写),如uploadWithByte方法生成的类名为UploadWithByte。如果要设置file参数的值,可以使用UploadWithByte类的setFile方法,代码如下:

    UploadWithByte uwb = new UPloadWithByte();
    uwb.setFile(dh);

    最后是调用uploadWithByte方法,代码如下(FileServiceStubwsdl2java生成的stub类名):

    FileServiceStub fss = new FileServiceStub();
    fss.uploadWithByte(uwb);

     

    如果使用C#调用FileService,则file参数类型均为byte[],代码如下:

    MemoryStream ms = new MemoryStream();
    Bitmap bitmap 
    = new Bitmap(picUpdateImage.Image);
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    service.fileService fs 
    = new WSC.service.fileService();
    fs.uploadWithDataHandler(ms.ToArray());
    fs.uploadWithByte(ms.ToArray());
     

    其中picUpdateImagec#中加载图像文件的picturebox控件。

     

    转载:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/01/22/252305.html

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/weipeng/p/2451310.html
Copyright © 2011-2022 走看看