视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
WebService大讲堂之Axis2(4):二进制文件传输
2025-09-30 22:55:06 责编:小OO
文档
WebService大讲堂之Axis2(4):二进制文件传输

在《WebService大讲堂之Axis2(2):复合类型数据的传递》中讲过,如果要传递二进制文件(如图像、音频文件等),可以使用byte[]作为数据类型进行传递,然后客户端使用RPC方式进行调用。这样做只是其中的一种方法,除此之外,在客户端还可以使用wsdl2java命令生成相应的stub类来调用WebService,wsdl2java命令的用法详见《WebService大讲堂之Axis2(1):用POJO实现0配置的WebService》。

    WebService类中包含byte[]类型参数的方法在wsdl2java生成的stub类中对应的数据类型不再是byte[]类型,而是javax.activation.DataHandler。DataHandler类是专门用来映射WebService二进制类型的。

    在WebService类中除了可以使用byte[]作为传输二进制的数据类型外,也可以使用javax.activation.DataHandler作为数据类型。 不管是使用byte[],还是使用javax.activation.DataHandler作为WebService方法的数据类型,使用wsdl2java命令生成的stub类中相应方法的类型都是javax.activation.DataHandler。而象使用.net、delphi生成的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.FileService 

    

        

                    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

    

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

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

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

UploadWithByte uwb = new UPloadWithByte();

uwb.setFile(dh);

最后是调用uploadWithByte方法,代码如下(FileServiceStub为wsdl2java生成的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()); 

其中picUpdateImage为c#中加载图像文件的picturebox控件。下载本文

显示全文
专题