二、微信小程序-分块上传,断点续传

10 篇文章 0 订阅
8 篇文章 1 订阅
本文详细介绍了如何在腾讯云COS中使用高级上传功能uploadFile进行分块上传,包括获取临时秘钥、设置分块策略、onProgress和onTaskReady回调,以及如何利用sliceUploadFile和组合式API实现断点续传功能。通过实例展示了如何在小程序中操作COS进行文件上传并支持续传功能。
摘要由CSDN通过智能技术生成

引入cos配置,请查看小程序引入cos配置
分块上传方法
1、采用cos高级上传cos.uploadFile。通过设置分块阈值SliceSize,达到阈值采用分块上传,没有达到阈值采用简单上传。
也就是说高级上传cos.uploadFile,它可以上传任何大小的文件。
2、直接采用cos分块上传cos.sliceUploadFile。
3、采用cos分块上传组合api:

  • cos.multipartInit初始化分块上传任务
  • cos.multipartUpload分块上传文件
  • cos.multipartComplete完成整个文件的分块上传

一、cos高级上传uploadFile

1、获取临时秘钥,初始化cos

// 推荐用法
export const cos = new COS({
  Protocol: "https:",
  SimpleUploadMethod: "putObject",
  getAuthorization: function (options, callback) {
    app.api.getCos().then((res) => {
      console.log('cos临时秘钥----------', res);
      if (res?.Body) {
        callback({
          TmpSecretId: res.Body.TmpSecretId,
          TmpSecretKey: res.Body.TmpSecretKey,
          SecurityToken: res.Body.SessionToken,
          StartTime: res.Body.StartTime,
          ExpiredTime: res.Body.ExpiredTime,
        });
      }
    });
  },
});

// 不使用临时秘钥,也可以这么写,不推荐
// 秘钥对 SECRETID 和 SECRETKEY 请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理;
// export const cos = new COS({
//   SecretId: "AKIDGUiu3AHQ8jasdvfTnBTfmQvCIApFP",
//   SecretKey: "AC2kYGrPxMdokasdzIQK2VkpnY5OEx",
//   Protocol: "https:",
//   SimpleUploadMethod: "putObject",
// });

2、使用cos高级上传-进行分块上传

2.1、高级上传cos.uploadFile。 通过设置分块上传阈值,达到阈值就采用分块上传sliceUploadFile,否则就是简单上传putObject
俩个重要回调函数:
onProgress

  • 每个分块上传成功时,才会执行
  • 每一个分块上传时,都会返回一个progressData对象。progressData有以下四个值
  • loaded已上传文件的大小、total整个文件大小、 speed上传速度、 percent上传百分比(小数形式)

onTaskReady

  • 分块不管上传成功还是失败,都会返回一个taskId,且每次上传只执行一次
  • taskId标识当前上传任务的id。继续上传,暂停上传,需要taskId

callBack:在 上传失败、上传成功、onProgress、onTaskReady 都会执行callBack回调函数。分别将 失败信息、 访问url、 progressData对象、taskId任务id 等信息 。抛出去

export function cosUpload(file, callBack) {
  const { filePath } = file;
  const BucketRegion = getBucketRegion(); // 拿到存储桶地域,名称
  cos.uploadFile(
    {
      ...BucketRegion,
      Key: getCosKey(file), // 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)支持中文,必须字段
      FilePath: filePath, // 上传文件路径,必须字段
      ChunkSize: 1048576, // 分块上传时,每块的字节数大小,默认值1048576(1MB)1MB是分块最小值
      SliceSize: 1024 * 1024 * 3, // 触发分块上传的阈值,超过3MB使用分块上传,小于3MB使用简单上传。可自行设置,非必须
      onProgress: function (progressData) {
        callBack && callBack({ progress: progressData });
      },
      onTaskReady: function (taskId) {
        callBack && callBack({ taskId: taskId });
      },
    },
    function (err, data) {
      if (err) {
        console.error("【uploadFile】上传失败", err);
        callBack && callBack({ err: err });
      } else {
        getCosObjectUrl(
          {
            ...BucketRegion,
            Key: getCosKey(file),
            Sign: false, // true获取带签名的对象URL
          },
          (res) => {
            callBack && callBack({ url: res });
          }
        );
      }
    }
  );
}

2.2、继续上传,暂停上传,获取访问Url

  • 暂停上传
    • 调用pauseTask方法,参数是当前任务的任务id
  • 继续上传
    • 调用restartTask方法,参数是当前任务的任务id
    • 可以用于开启用户手动停止的(调用 pauseTask 停止)或者因为上传错误(断网等因素)而停止的上传任务。
    • 这个时候可以继续上传,不在需要重新选择文件上传
// 继续上传
export function cosTaskContinue(taskId) {
  cos.restartTask(taskId);
}
// 暂定上传
export function cosTaskPause(taskId) {
  cos.pauseTask(taskId);
}

// 拿对象访问URL
function getCosObjectUrl(data, urlCallBack) {
  cos.getObjectUrl({ ...data }, function (err, data) {
    if (err) {
      return console.error("【getObjectUrl】获取存储对象Url失败", err);
    }
    /* url为对象访问 url */
    const CosObjectUrl = data.Url;
    urlCallBack(CosObjectUrl);
  });
}

3、具体代码实现

调用封装高级上传方法
progress: {}, // 每个分块上传成功-返回的信息
taskId: “”, // 上传任务id
err: false, // true上传失败/上传暂停

  handlePiecemeal() {
    let that = this;
    wx.chooseMedia({
      count: 1,
      mediaType: ["video"],
      sourceType: ["album", "camera"],
      maxDuration: 30,
      sizeType: ["compressed"],
      camera: "back",
      success(data) {
        const timestamp = new Date().getTime();
        const random = Math.ceil(Math.random() * 10000);
        const params = {
          fileName: timestamp + random,
          filePath: data.tempFiles[0].tempFilePath,
          storagePath: "file/",
        };
        // cosUpload封装的cos高级上传
        cosUpload(params, (data) => {
          if (data?.taskId) {
            that.setData({
              taskId: data.taskId,
            });
          };
          if (data?.err) {
            that.setData({
              err: true,
            });
          };
          if (
            data?.progress &&
            data?.progress.percent != 0 &&
            data?.progress.loaded != 0
          ) {
            data.progress.speed = Math.ceil(data.progress.speed / 1024);
            data.progress.percent = Math.ceil(data.progress.percent * 100);
            that.setData({
              progress: data.progress,
            });
          };
          if (data?.url) {
            console.log("上传成功", data.url);
            wx.showToast({
              title: "上传成功,请在控制台查看",
              icon: "none",
              duration: 1800,
            });
            that.setData({
              err: false,
              taskId: "",
            });
          };
        });
      },
    });
  },

二、cos分块上传sliceUploadFile

使用示例参数:

  • Bucket:存储桶名称

  • Region:存储桶地域

  • Key: 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)

  • FilePath:文件临时路径

  • FileSize:文件大小

  • onTaskReady:上传任务创建时的回调函数,返回一个 taskId

  • onHashProgress:计算文件的进度回调函数,返回progressData对象

    • loaded 已经校验的文件部分大小
    • total 整个文件的大小
    • speed 文件的校验速度
    • percent 文件的校验百分比
  • onProgress:上传文件的进度回调函数,返回progressData对象

    • loaded 已经上传的文件部分大小
    • total 整个文件的大小
    • speed 文件的上传速度
    • percent 文件的上传百分比
var sliceUploadFile = function (file) {
    var key = file.name;
    cos.sliceUploadFile({
        Bucket: 'examplebucket-1250000000',         	/* 必须 */
        Region: 'COS_REGION',         	/* 必须 */
        Key: 'exampleobject',           /* 必须 */
        FilePath: file.path,            /* 必须 */
        FileSize: file.size,            /* 非必须 */
        onTaskReady: function(taskId) { /* 非必须 */
            console.log(taskId);
        },
        onHashProgress: function(info) { /* 非必须 */
            console.log('check hash', JSON.stringify(info));
        },
        onProgress: function(info) {     /* 非必须 */
            console.log(JSON.stringify(info));
        }
    }, callback);
};
wx.chooseMessageFile({
    count: 1,
    type: 'all',
    success: function(res) {
        sliceUploadFile(res.tempFiles[0]);
    }
});

三、分块上传组合式api

讲一下大概思路:
组合式api

实现效果

基于高级上传的实现效果

小程序分块上传,断点续传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F2E_zeke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值