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) {
}
});