一、微信小程序(简单上传)-存储图片视频文件


cos对象存储,可以存储图片视频以及任何格式的文档。
以下介绍怎么使用cos存储图片视频文件,需要做什么配置,如何使用。
想了解更多-请访问cos对象存储开发文档
想了解分块上传/断点续传-请访问微信小程序分块上传/断点续传


一、微信小程序怎么引入cos?

安装方式,有俩种:一手动安装,就是在官网将cos源码放在自己项目下;二是通过npm安装(推荐使用)
通过npm安装cos-wx-sdk-v5,

npm install cos-wx-sdk-v5
// 安装完成之后
// 程序代码使用 var COS = require('cos-wx-sdk-v5'); 进行引用

二、使用配置

1、使用前配置白名单
小程序里请求 COS 需要登录到 微信公众平台,选择开发 > 开发设置 > 服务器域名,配置域名白名单。SDK 使用到了两个接口:

  • cos.postObject 使用 wx.uploadFile 方法。
  • 其他方法使用 wx.request 方法。

也就是说:
用 cos.postObject 需要配置 uploadFile 合法域名白名单即可。
其他 cos api 则需要配置 request 合法域名白名单。
例如:https://存储桶名称.cos.ap-存储桶地域.myqcloud.com
当然如果你的存储桶开启了cdn加速域名,需要配置cdn域名进去。开了cdn域名的话,你访问时是通过cdn域名访问的
域名白名单

三、代码实现-小程序简单上传

创建一个cosSdk.js文件,里面写上 cos初始化, 存储文件, 获取文件访问地址
1、建议使用临时秘钥进行调用SDK,cos初始化

// 这里面针对不同环境,配置着不同的cos存储桶名称,地域和访问地址前缀
import { EnvConfig } from '../config/index';
const COS = require('cos-wx-sdk-v5');
const app = getApp();

// 初始化
export const cos = new COS({
  Protocol: 'https:', // 请求协议: 'https:' 或 'http:'
  // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用putObject,sdk版本至少需要v1.3.0
  SimpleUploadMethod: 'putObject',
  getAuthorization: function (options, callback) {
  	// 这里调用后端接口获取访问SDK的临时秘钥
    app.api.getCos().then(res => {
      console.log('cos临时秘钥----------', res);
      if (res?.Body) {
        callback({
          TmpSecretId: res.Body.TmpSecretId,
          TmpSecretKey: res.Body.TmpSecretKey,
          // v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
          SecurityToken: res.Body.SessionToken,
          // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
          StartTime: res.Body.StartTime, // 时间戳,单位秒,如:1580000000
          ExpiredTime: res.Body.ExpiredTime, // 时间戳,单位秒,如:1580000900
        })
      };
    });
  }
});

2、简单上传,存储文件

/**
 * 简单上传
 * @fileName *必须 文件名
 * @filePath *必须 文件路径
 * @storagePath *非必须 cos存储桶路径 默认存储在static文件夹下
 * ImgcallBack 回调函数,在调用cosUploadImg上传方法是,可通过此回调函数拿到存储对象的访问Url
 */
export function cosUploadImg(file, ImgcallBack) {
  // 参数校验(俩必传一非必传)
  if (!file.fileName || !file.filePath) {
    console.error('【putObject】简单上传,参数fileName文件名、参数filePath文件路径是必须');
    return;
  };
  // 配置上传需要的参数
  const { fileName, filePath } = file;
  const storagePath = file.storagePath || 'static/';
  const fileSuffix = (filePath.substr(filePath.lastIndexOf('.')));
  const ObjectData = {
    Bucket: EnvConfig.cosConfig.Bucket, // 存储桶名称
    Region: EnvConfig.cosConfig.Region, // 存储桶地域
    Key: storagePath + fileName + fileSuffix, // 存储在桶里的对象键
  };
  // 使用 FilePath 参数需要 sdk 版本至少达到v1.3.0
  cos.putObject({
    ...ObjectData,
    FilePath: filePath, // FilePath传入的是文件路径
  }, function(err) {
  	// 上传失败
    if (err) {
      wx.showToast({
        title: '【图片上传】上传失败',
        icon: 'none',
        mask: true,
      });
      return;
    };
    // 上传成功后-拿到访问地址-并抛出
    getCosObjectUrl({
      ...ObjectData,
      Sign: false, // true获取带签名的对象URL
    }, (res) => {
      // 这里res,是function getCosObjectUrl(data, urlCallBack)中urlCallBack回调函数中传过来的
      ImgcallBack(res, ObjectData);
    });
  });
}

3、获取文件访问地址

// 拿到对象的访问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;
      // 将拿到的访问url,传入回调函数中
      urlCallBack(CosObjectUrl);
    }
  );
}

四、获取时效的访问url

1、访问Url的时效性。

  • 前端在获取访问url时,传入一个Sign参数,值为true
  • 后端在获取并返回临时秘钥,设置时效性就可以
  • 如果设置时效3600s,那么获取到访问地址后一个小时内是有效的
function getCosObjectUrl(data, urlCallBack) {
  cos.getObjectUrl(
    {
       ...data,
      Sign: true, // true获取带签名的对象 URL
      Expires: 3600, // 与后端请求的临时秘钥时效保持一致
      Method: 'GET',
    },
    function (err, data) {
      if (err) {
        return console.error('【getObjectUrl】获取存储对象Url失败', err);
      };
      /* url为对象访问 url */
      const CosObjectUrl = data.Url;
      // 将拿到的访问url,传入回调函数中
      urlCallBack(CosObjectUrl);
    }
  );
}

问题小事项

1、拿到访问url时,想进行图片裁切,在访问Url后面拼接上
?imageMogr2/cut/1480x1250x140x100

  • cut:自定义裁切
  • 1480x1250:裁切后的图片的宽高
  • 140x100:裁切点的位置;以左上角为基点,140距离左边的宽,100距离上边的高。
  • 拼接后,形成新的访问URL,这访问的就是裁切后的图片。
  • 图片处理不止自定义裁切,还有其他基础图片处理,可访问图片处理查看。

2、cos.putObject方法不是说只能上传图片,也可以上传视频和文档。在上传时,需要注意存储在桶里的对象键Key的文件后缀。在上面示例代码里:

  • Key: storagePath + fileName + fileSuffix, // 存储在桶里的对象键
  • storagePath 是存储路径
  • fileName 存储的文件名
  • fileSuffix 存储的文件后缀
    如果存储的是图片的话,fileSuffix 值可以是.png .jpg .gif等
    如果存储的是视频的话,fileSuffix 值可以是.mp4等
    如果存储的是文档的话,fileSuffix 值可以是.xlx .txt .pdf等

例如:下面,存储桶的static文件夹下的 域名白名单.png图片。
storagePath:static/
fileName:域名白名单
fileSuffix:.png
那么存储在桶里的对象键Key:static/域名白名单.png
存储路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

F2E_zeke

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

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

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

打赏作者

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

抵扣说明:

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

余额充值