【原創】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類的程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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檔案的配置程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><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類的物件例項,程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DataHandler dh = new DataHandler(new FileDataSource(imagePath));
wsdl2java命令會為每一個方法生成一個封裝方法引數的類,類名為方法名(第一個字元大寫),如uploadWithByte方法生成的類名為UploadWithByte。如果要設定file引數的值,可以使用UploadWithByte類的setFile方法,程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->UploadWithByte uwb = new UPloadWithByte();
uwb.setFile(dh);
最後是呼叫uploadWithByte方法,程式碼如下(FileServiceStub為wsdl2java生成的stub類名):
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->FileServiceStub fss = new FileServiceStub();
fss.uploadWithByte(uwb);
如果使用C#呼叫FileService,則file引數型別均為byte[],程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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());
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-545206/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】WebService大講堂之Axis2(3):使用services.xml檔案釋出WebServiceWebXML
- 【原創】WebService大講堂之Axis2(7):將Spring的裝配JavaBean釋出成WebServiceWebSpringJavaBean
- WebService大講堂之Axis2(6):跨服務會話(Session)管理Web會話Session
- webservice傳輸檔案Web
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- 【轉載】傳送SAP附件到 WEBSERVICE介面(二進位制)Web
- MySQL如何傳輸二進位制日誌MySql
- JAX-WS - 二進位制處理之MTOM(檔案上傳)
- 二進位制檔案複製
- php寫二進位制檔案PHP
- 二進位制檔案拷貝
- 使用POST方法傳輸二進位制資料
- 如何快速傳輸大檔案:4 種大檔案傳輸有效的方法
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- 二進位制檔案視覺化(二)視覺化
- C++中的檔案輸入/輸出(5):二進位制檔案的處理 (轉)C++
- 檔案操作(二進位制拷貝)
- Git處理二進位制檔案Git
- MySQL二進位制檔案(binlog)MySql
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 文字檔案與二進位制檔案的區別
- Python讀寫二進位制檔案Python
- Java二進位制Class檔案格式解析Java
- c++ 二進位制儲存檔案C++
- C#的二進位制檔案操作C#
- 使用UltraEdit 拷貝二進位制檔案
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- FTP的傳輸有兩種方式:ASCII傳輸模式和二進位制資料傳輸模式FTPASCII模式
- 如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
- 二進位制轉換成十進位制然後輸出 學堂線上第二章作業2-2
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 20160408javaweb之JDBC 大二進位制和大檔案存取JavaWebJDBC
- websocket 二進位制資料傳輸基礎準備工作Web
- WebSocket系列之二進位制資料設計與傳輸Web
- 企業經常需要進行傳輸檔案,大檔案傳輸有哪些方法?
- 大檔案如何傳輸,大檔案的傳輸方式有哪些?
- MySQL 匯出匯入二進位制檔案MySql
- UltraEdit--二進位制檔案編輯功能