Android Link SDK的文件上傳功能使用HTTP2流式傳輸協議。本文描述上傳文件到物聯網平臺的方法。

前提條件

已下載Android SDK Demo

背景信息

文件上傳功能:
  • 支持兩種上傳模式:
    • 以創建文件的方式上傳。
    • 以覆蓋文件的方式上傳。
  • 支持指定上傳長度,并在下次上傳時續傳。您可在上傳時根據網絡帶寬參數part_len分配上傳文件的大小,以提高帶寬利用效率。
注意 如果設備需要文件上傳功能,設備接入認證時不能選擇動態注冊免白名單方案。
本文以Android Link SDK下載文件中的H2FileManagerActivity.java為例,講解如何使用文件上傳功能。
說明 H2FileManagerActivity.java文件所在目錄為src/main/java/com/aliyun/alink/devicesdk/demo/

初始化

IStreamSender是HTTP2流通道接口類。

注意 下文代碼endPoint參數中cn-shanghai部分需要根據region進行相應修改,不同region對應的Region ID,請參見地域和可用區
LinkKitInitParams params = new LinkKitInitParams();
params.deviceInfo = deviceInfo; // 參考Demo
// params.propertyValues = propertyValues; // 其他初始化參數
// params.connectConfig = userData;
// H2初始化參數
IoTH2Config ioTH2Config = new IoTH2Config();
ioTH2Config.clientId = "client-id";
// 注意替換{pk}為真實productKey
// ioTH2Config.endPoint = "https://{pk}.iot-as-http2.cn-shanghai.aliyuncs.com";
params.iotH2InitParams = ioTH2Config;
// 執行Link SDK初始化
// Link SDK初始化成功之后可以使用如果方式獲取IStreamSender實例
IStreamSender client = LinkKit.getInstance().getH2StreamClient();
            

建立連接

CompletableListener是通用的異步回調接口。

// 有可能會拋出已建連、網絡相關exception
// client即初始化獲得的IStreamSender實現實例
client = LinkKit.getInstance().getH2StreamClient();
client.connect(new CompletableListener<Object>() {

    @Override
    public void complete(Object o) {
        // 建連成功
    }

    @Override
    public void completeExceptionally(Throwable throwable) {
        // 建連失敗
    }
});
            

非斷點續傳

文件上傳類型,請參見IANA Media Type

final Http2Request request = new Http2Request();
//OSS上存儲的文件名。文件名校驗規則正則表達式為[a-zA-Z][a-zA-Z0-9_.]*。
request.getHeaders().add("x-file-name", "fileName");
//是否覆蓋同名文件。0(不覆蓋), 1(覆蓋)。默認為0。如果文件已存在,并指定了不默認覆蓋,則創建流失敗
request.getHeaders().add("x-file-overwrite", "1");
//文件類型,不指定則由OSS自動指定。
// request.getHeaders().add("x-file-content-type", "jpg");

String serviceName = "/c/iot/sys/thing/file/upload";
// 注意替換成真實上傳文件的路徑
String filePath = "/sdcard/demo.jpg";

client.uploadFile(serviceNme, request, filePath, new CompletableDataListener<Http2Response>() {
    @Override
    public void complete(Http2Response http2Response) {
        // 上傳成功
    }

    @Override
    public void completeExceptionally(Throwable throwable) {
        // 上傳失敗
    }

    @Override
    public void callBack(String fileUploadID) {
        // 本次上傳的ID,如果需要斷點續傳,需要傳入這個fileUploadID
        // 回調多次,請保存最后一次的fileUploadID用于后續斷點續傳
    }
});
            

斷點續傳

如果文件之前上傳失敗了,需要進行文件續傳的話,需要傳入上一次的fileUploadId。

final Http2Request request = new Http2Request();
// fileUploadId為上一次未上傳完成的ID
request.getHeaders().add("x-file-upload-id", fileUploadId);
String serviceName = "/c/iot/sys/thing/file/upload";
// 注意替換成真實上傳文件的路徑
String filePath = "/sdcard/demo.jpg";

client.uploadFile(serviceNme, request, filePath, new CompletableDataListener<Http2Response>() {
    @Override
    public void complete(Http2Response http2Response) {
        showToast(http2Response.toString() + "success");
    }

    @Override
    public void completeExceptionally(Throwable throwable) {
        showToast(throwable.toString() + "fail");
    }

    @Override
    public void callBack(String fileUploadID) {
        fileUploadId = fileUploadID;
    }
});
            

斷開連接

文件上傳完成之后斷開連接。

// client即初始化獲得的IStreamSender實現實例
client.disconnect(new CompletableListener() {
    @Override
    public void complete(Object o) {
    }

    @Override
    public void completeExceptionally(Throwable throwable) {
    }
});