全部产品
云市场

文件上传

更新时间:2018-12-19 17:08:18

整体步骤

  1. 请求上传地址加凭证或STS,相关概念请参见相关文档;
  2. 初始化上传实例,实例化上传有两种方式:上传地址加凭证和STS方式;
  3. 回调设置,所有的上传状态包括进度,上传成功,上传失败,凭证过期都在这里进行处理;
  4. 添加上传文件进入上传列表,目前主要支持视频文件和图片文件的上传;
  5. 启动上传;
  6. 回调处理;

1. 请求上传地址加凭证或STS

1.1 请求上传地址加凭证

上传图片和上传视频获取上传地址和凭证所请求的API是不同的。客户端上传视频:需要请求向AppServer发送请求,AppServer通过OpenApi向阿里云点播服务发送CreateUploadVideo请求。请求成功将返回上传地址,上传凭证以及VideoId,AppServer需要将结果返回给客户端。客户端上传图片:需要请求向AppServer发送请求,AppServer通过OpenApi向阿里云点播服务发送CreateUploadImage请求。请求成功将返回上传地址,上传凭证以及ImageURL,AppServer需要将结果返回给客户端。

1.2 请求STS

通过STS方式,客户端需要向AppServer发送请求,AppServer向阿里云STS服务请求临时STS凭证。请求成功将返回STS凭证,AppServer需要将结果返回给客户端。

2. 初始化

首先,我们需要声明一个VODUploadClient初始化回调

  1. uploader = new VODUploadClientImpl(getApplicationContext());

2.1 上传地址和凭证方式

上传地址和凭证方式调用init方法初始化。第一步请求获取的上传地址和凭证初始化时无需设置,而是在开始上传开始后触发的onUploadStarted回调中调用setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress);方法进行设置。当token超时,会触发onUploadTokenExpired回调,需要调用resumeWithAuth(uploadAuth)方法,设置新的上传凭证继续上传。

示例代码

  1. // create VODUploadClient
  2. final VODUploadClient uploader = new VODUploadClientImpl(getApplicationContext());
  3. // setup callback
  4. VODUploadCallback callback = new VODUploadCallback() {
  5. public void onUploadSucceed(UploadFileInfo info) {
  6. OSSLog.logDebug("onsucceed ------------------" + info.getFilePath());
  7. }
  8. public void onUploadFailed(UploadFileInfo info, String code, String message) {
  9. OSSLog.logError("onfailed ------------------ " + info.getFilePath() + " " + code + " " + message);
  10. }
  11. public void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize) {
  12. OSSLog.logDebug("onProgress ------------------ " + info.getFilePath() + " " + uploadedSize + " " + totalSize);
  13. }
  14. }
  15. }
  16. public void onUploadTokenExpired() {
  17. OSSLog.logError("onExpired ------------- ");
  18. // 重新刷新上传凭证:RefreshUploadVideo
  19. uploadAuth = "此处需要设置重新刷新凭证之后的值";
  20. uploader.resumeWithAuth(uploadAuth);
  21. }
  22. public void onUploadRetry(String code, String message) {
  23. OSSLog.logError("onUploadRetry ------------- ");
  24. }
  25. public void onUploadRetryResume() {
  26. OSSLog.logError("onUploadRetryResume ------------- ");
  27. }
  28. public void onUploadStarted(UploadFileInfo uploadFileInfo) {
  29. OSSLog.logError("onUploadStarted ------------- ");
  30. uploader.setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress);
  31. }
  32. };
  33. //上传初始化
  34. uploader.init(callback);

2.2 STS方式

STS方式调用init(accessKeyId, accessKeySecret, secretToken, expireTime, callback);方法初始化,初始化参数即是第一步请求获取的临时STS凭证。当token过期时,触发OnUploadTokenExpired回调,需要调用resumeWithToken(accessKeyId, accessKeySecret, secretToken, expireTime);方法,设置新的STS继续上传。

  1. // create VODUploadClient object
  2. uploader = new VODUploadClientImpl(getApplicationContext());
  3. // setup callback
  4. // setup callback
  5. VODUploadCallback callback = new VODUploadCallback() {
  6. public void onUploadSucceed(UploadFileInfo info) {
  7. OSSLog.logDebug("onsucceed ------------------" + info.getFilePath());
  8. }
  9. public void onUploadFailed(UploadFileInfo info, String code, String message) {
  10. OSSLog.logError("onfailed ------------------ " + info.getFilePath() + " " + code + " " + message);
  11. }
  12. public void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize) {
  13. OSSLog.logDebug("onProgress ------------------ " + info.getFilePath() + " " + uploadedSize + " " + totalSize);
  14. }
  15. }
  16. }
  17. public void onUploadTokenExpired() {
  18. OSSLog.logError("onExpired ------------- ");
  19. // 重新获取STS之后调用resumeWithToken
  20. uploader.resumeWithToken(accessKeyId, accessKeySecret, secretToken, expireTime);
  21. }
  22. public void onUploadRetry(String code, String message) {
  23. OSSLog.logError("onUploadRetry ------------- ");
  24. }
  25. public void onUploadRetryResume() {
  26. OSSLog.logError("onUploadRetryResume ------------- ");
  27. }
  28. public void onUploadStarted(UploadFileInfo uploadFileInfo) {
  29. OSSLog.logError("onUploadStarted ------------- ");
  30. uploader.setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress);
  31. }
  32. };
  33. // 初始化,临时账号过期时,在onUploadTokenExpired事件中,用resumeWithToken更新临时账号,上传默认支持断点续传
  34. uploader.init(accessKeyId, accessKeySecret, secretToken, expireTime, callback);

3. 回调设置

从初始化代码片段中可以看到,两种方法初始化都需要设置VODUploadCallback对象,该对象是上传状态的回调类,需要设置下列回调方法:

  1. /**
  2. 上传完成回调
  3. @param info 上传文件信息
  4. @param result 上传结果信息
  5. */
  6. void onUploadFinished(UploadFileInfo info, VodUploadResult result);
  7. /**
  8. 上传失败回调
  9. @param info 上传文件信息
  10. @param code 错误码
  11. @param message 错误描述
  12. */
  13. void onUploadFailed(UploadFileInfo info, String code, String message);
  14. /**
  15. 上传进度回调
  16. @param fileInfo 上传文件信息
  17. @param uploadedSize 已上传大小
  18. @param totalSize 总大小
  19. */
  20. void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize);
  21. /**
  22. token过期回调
  23. 上传地址和凭证方式上传需要调用resumeWithAuth方法继续上传
  24. STS方式上传需要调用resumeWithToken方法继续上传
  25. */
  26. void onUploadTokenExpired();
  27. /**
  28. 上传开始重试回调
  29. */
  30. void onUploadRetry(String code, String message);
  31. /**
  32. 上传结束重试,继续上传回调
  33. */
  34. void onUploadRetryResume ();
  35. /**
  36. 开始上传回调
  37. 上传地址和凭证方式上传需要调用setUploadAuthAndAddress:uploadAuth:uploadAddress:方法设置上传地址和凭证
  38. @param fileInfo 上传文件信息
  39. */
  40. void onUploadStarted(UploadFileInfo uploadFileInfo);

4. 添加文件到上传列表

4.1 添加文件

添加视频

  1. String filePath = "文件地址";
  2. VodInfo vodInfo = new VodInfo();
  3. vodInfo.setTitle("标题" + index);
  4. vodInfo.setDesc("描述." + index);
  5. vodInfo.cateId (19);
  6. vodInfo.tags("sports");
  7. uploader.addFile(filePath,vodInfo);

添加图片``javaString filePath = “图片文件地址”;VodInfo vodInfo = new VodInfo();vodInfo.setTitle(“标题” + index);vodInfo.setDesc(“描述.” + index);vodInfo.cateId (19);vodInfo.tags(“sports”);uploader.addFile(filePath,vodInfo);

  1. > 注意:支持的文件大小<=4G
  2. VodInfo具体结构如下:

//标题String title;//标签List tags;//描述String desc;//分类idInteger cateId;//封面url (完整的URL https://)String coverUrl;

  1. 添加文件后,SDK会将待上传文件封装为`UploadFileInfo`对象,具体结构如下:
  2. ```java
  3. //文件本地路径
  4. String filePath;
  5. //endpoint
  6. String endpoint;
  7. //bucket
  8. String bucket;
  9. //object
  10. String object;
  11. //VodInfo
  12. VodInfo vodInfo;

4.2 管理上传队列

VODUploadClient支持添加多个文件顺序上传,提供了以下方法管理上传队列。从队列中删除上传文件。如果待删除的文件正在上传中,则取消上传并自动上传下一个文件:

  1. void deleteFile(int index)

清空上传队列,如果有文件在上传,则取消上传:

  1. void clearFiles()

获取上传文件队列:

  1. List<UploadFileInfo> listFiles()

将文件标记为取消,文件任保留在上传列表中。如果待取消的文件正在上传中,则取消上传并自动上传下一个文件:

  1. cancelFile(int index)

恢复已取消的上传文件,并自动开始上传:

  1. resumeFile(int index)

尽管VODUploadClient支持多文件上传,如果使用上传凭证和地址方式上传,每个文件还是需要单独设置。基于多文件上传代码复杂度的考虑,建议只添加单文件上传。

5. 上传控制

开始上传:

  1. void start();

该方法调用后,会触发onUploadStarted回调。注意,如果通过上传地址和凭证方式上传,需要在该回调方法中设置上传地址和凭证。代码如下:

  1. void setUploadAuthAndAddress(UploadFileInfo uploadFileInfo, String uploadAuth, String uploadAddress)

停止上传,如果有文件正在上传中,则取消上传:

  1. void stop();

stop后恢复上传需要调用resumeFile恢复待上传文件,或者清空队列后重新添加文件上传。

暂停上传:

  1. void pause();

恢复上传:

  1. void resume();

5. 回调处理

5.1 上传进度

每上传一个分片,会触发onUploadProgress回调,回调参数包括已上传文件大小uploadedSize和总文件大小totalSize

5.2 上传成功

上传成功时,会触发onUploadSucceed回调。回调包含上传结果videoIdimageUrl属性

视频上传成功后会返回videoId作为视频id,拿到videoId之后需要获取播放地址进行播放。相关文档可以参考获取播放地址播放。图片上完成后会返回imageUrl,开启URL鉴权后imageUrl会有过期时间。相关配置可以参考URL鉴权

5.3 上传失败

上传失败时,会触发onUploadFailed(String code, String message)回调。在该回调方法中,我们可以通过codemessage查看具体原因,页面上给予用户提示。错误码参见:点播错误码oss错误码

5.4 凭证过期处理

上传凭证和STS过期,会触发onSTSTokenExpried回调。在该回调方法中,我们可以向AppServer重新请求新的STS凭证,并调用以下方法继续上传:

  1. refreshSTSToken(accessKeyId,accessKeySecret,securityToken,expriedTime);

5.5 超时处理

上传超时,会触发uploadRetry回调并自动重试。在该回调方法中,我们可以在页面上给予用户提示或者调用cancel方法停止上传。此外,可以设置maxRetryCount属性,指定最大重试次数。超时重试发现可以继续上传时,会触发uploadRetryResume回调并恢复上传。

高级设置

VODUploadClient支持以下高级设置:

  1. /**
  2. 上传文件到服务端是否转码,默认值YES
  3. */
  4. void setTranscodeMode(boolean bool);
  5. /**
  6. 分片大小,默认值1024 * 1024
  7. */
  8. void setPartSize(long partSize);
  9. /**
  10. * 指定视频文件的存储区域
  11. */
  12. void setStorageLocation(String storageLocation);
  13. /**
  14. * 设置转码模版组Id
  15. */
  16. void setTemplateGroupId(String templateGroupId);