WebService大讲堂之Axis2(4):二进制文件传输
发布时间:2020-12-17 02:34:51 所属栏目:安全 来源:网络整理
导读:?在《 WebService大讲堂之Axis2(2):复合类型数据的传递 》中讲过,如果要传递二进制文件(如图像、音频文件等),可以使用 byte[] 作为数据类型进行传递,然后客户端使用 RPC 方式进行调用。这样做只是其中的一种方法,除此之外,在客户端还可以使用 wsdl
?在《
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?
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
方法,代码如下(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
控件。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- cathome 猫家 开发日记-webservice服务 ,生成json.
- python – Docker如何运行pip require.txt只有有变化?
- AngularJS – 将http前缀添加到url输入字段
- 在angular / angularjs混合应用程序中使用downgradeModule和
- bash – 每次创建新用户时执行shell脚本
- AngularJS控制器controller如何通信?
- SBT:如何在scala 2.12项目中使用scala 2.11库
- AngularJS jqLite详情
- angularjs – 使用jasmine测试角度工厂时出现未知的提供程序
- 天翼云平台yum 源