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