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