SDK的文件上传功能使用HTTP2流式传输协议, 将文件上传至阿里云物联网平台服务器.

功能说明

  • 支持多种上传模式, 如以创建文件的方式上传, 或以覆盖文件的方式上传
  • 支持指定上传长度, 并在下次上传时续传, 用户可在上传时根据网络带宽配置上传分配大小(part_len), 以提高带宽利用效率

本节以 src/main/java/.../H2FileManagerActivity.java 为例讲解如何使用文件上传功能

初始化

IStreamSender 是 HTTP2 流通道接口类。

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;
// 执行linkkit 初始化
// linkkit 初始化成功之后可以使用如果方式获取 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) {
    }
});