首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Axis2 系列教程(四):二進制文件傳輸實戰

     編輯:Java 相關知識

二進制傳輸方式對比

Axis2 支援兩種二進制數據類型:byte[] 與 javax.activation.DataHandler。無論服務端使用哪種,wsdl2java 生成的 Java Stub 皆統一映射為 DataHandler;而 .NET、Delphi 等平台則映射為 byte[]。這是因為 DataHandler 為 Java 特有 API。

服務端實作:FileService

package service;
import java.io.*;
import javax.activation.DataHandler;

public class FileService {
    // 使用 byte[] 上傳
    public boolean uploadWithByte(byte[] file, String filename) {
        try (FileOutputStream fos = new FileOutputStream(filename)) {
            fos.write(file);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 使用 DataHandler 上傳
    public boolean uploadWithDataHandler(DataHandler file, String filename) {
        try (FileOutputStream fos = new FileOutputStream(filename)) {
            writeInputStreamToFile(file.getInputStream(), fos);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    private void writeInputStreamToFile(InputStream is, OutputStream os) throws IOException {
        byte[] buffer = new byte[8192];
        int n;
        while ((n = is.read(buffer)) > 0) {
            os.write(buffer, 0, n);
        }
    }
}

services.xml 配置

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

Java 客戶端調用

// 建立 DataHandler
DataHandler dh = new DataHandler(new FileDataSource(imagePath));

// 封裝參數(wsdl2java 會為每個方法生成對應的 Wrapper 類)
UploadWithByte uwb = new UploadWithByte();
uwb.setFile(dh);

// 調用
FileServiceStub fss = new FileServiceStub();
fss.uploadWithByte(uwb);

C# 客戶端調用

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();
// C# 兩種方法參數皆為 byte[]
fs.uploadWithDataHandler(ms.ToArray());
fs.uploadWithByte(ms.ToArray());

大檔案傳輸建議

若需傳輸大檔案,建議改用 FTP 等專用協議,Web Service 僅傳遞檔案元資料(如檔名、路徑),以提升效率並避免記憶體壓力。

序列化跨平台限制

利用 Java 序列化傳遞物件(byte[] 經 ObjectOutputStream)僅限於客戶端與服務端均為 Java 的情況;.NET 的序列化格式不相容,跨平台請改用 XML/JSON 等中性格式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved