微信小程序上传图片到阿里云oss方法

最近开发微信小程序要求上传图片到阿里云oss上,所以就顺手整理一下整个过程啦。

前提

开通oss服务和创建oss存储空间啦(这个就自己去解决吧)下面接入正题:

步骤一:配置 Bucket 跨域

客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息。OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的验证。因此需要为 Bucket 设置跨域规则以支持 Post 方法。
按照图下面配置就行:
在这里插入图片描述

步骤 2:配置外网域名到小程序的上传域名白名单中

1.通过 OSS 控制台查看外网域名。
在这里插入图片描述
2.登录微信小程序平台,配置小程序的上传域名白名单。
在这里插入图片描述
(以上准备就绪后就开始编写小程序代码啦~)

小程序直接上传

一.获取上传需要的签名(signature)和加密策略(policy)。
1.使用web上传的Dom 进行测试 :下载地址
2.修改 Demo 中 upload.js 的密钥和地址。
在这里插入图片描述
3.进行上传测试并得到signature和policy。
在这里插入图片描述
4.使用小程序代码上传图片

 wx.chooseImage({
     success: function (res) {
       var tempFilePaths = res.tempFilePaths
       console.log('chooseImage success, temp path is: ', tempFilePaths[0])
       wx.uploadFile({
         url: 'xxxxxxx',//上传的路径
         filePath: tempFilePaths[0],
         name: 'file',
         formData: {
           name: tempFilePaths[0],
           key: "${filename}",//上传图片的名字和路径(默认路径根目录,自定义目录:xxx/xxx.png)
           policy: "xxxxxxxxxxxxxxxxxxxxxx",
           OSSAccessKeyId: "xxxxxxxxxxxxxxxx",
           success_action_status: "200",
           signature: "xxxxxxxxxxxxxxx",
         },
         success: function (res) {
            console.log('chooseImage success, temp path is: ', tempFilePaths[0])
            wx.showToast({
              title: "上传成功",
              icon: 'success',
              duration: 1000
            })
         },
         fail: function ({errMsg}) {
            console.log('upladImage fail, errMsg is: ', errMsg)
            wx.showToast({
              title: "上传失败",
              duration: 1000
            })
         },
       })
     }
   })

二、后台返回签名(signature)和加密策略(policy)。
(上述“一”方法中由于有accessid/accesskey暴露在外,有泄漏的风险) 所以建议使用后端签名:
大概流程:请求后端接口–>获取返回的签名等所用到的数据–>调用上述 “一(4)”中的方法即可,整理后如下:

 //上传图片到阿里云
function uploadImgFile(params = {}) {
    let data = new Promise((resolve, reject) => {
      wx.chooseImage({
        count: 1,
        sizeType: ["compressed"],
        sourceType: ["album"],
        success: function (res) {
          //console.log(res);
          const imgsrc = res.tempFilePaths[0];
          const index = imgsrc.lastIndexOf("\.");
          const imgExtension = imgsrc.substring(index + 1, imgsrc.length);
          const imgPath = params.fileName + "." + imgExtension;
          wx.uploadFile({
            url: params.url,//上传地址,
            filePath: imgsrc,
            name: 'file',
            formData: {
              name: imgsrc,
              key: imgPath,//文件上传的位置(默认根目录)+文件名字 默认:"$(filename)"
              policy: params.policy,
              OSSAccessKeyId: params.accessid,
              success_action_status: '200', //让服务端返回200,不然,默认会返回204
              signature: params.signature,
            },
            success: function(res){
              let imgUrl = params.url + "/"+imgPath
              let _obj = Object.assign({ imgUrl: imgUrl }, res);
              resolve(_obj);
            }, 
            fail: function(res){
              reject("上传失败");
            }
          })
        },
      })
    })
    return data;
}
//调用时
let obj = {
      url: "xxxxxxxxxx",//上传路径
      fileName: "xxx/" + new Date().getTime(),//上传到xxx文件夹下(我这里图片重新命名)
      policy: policy,//后端返回的policy
      accessid: accessid,//后端返回的accessid
      signature: signature,//后端返回的signature
    }
    uploadImgFile(obj).then(function (res) {
     //console.log(res)
      if (res.statusCode==200){
        let src = res.imgUrl;//返回上传的图片地址
      }else{
        wx.showToast({
          title: res.errMsg,
          icon:'none',
          duration:2000,
        })
      }
    }).catch(function (err) {
      console.log('err:' + err);
    })

以上为自己整理的微信上传图片到oss全部内容,如有不足之处望指教。
注:至于评论中提到请求403问题请参考一下官方文档可能对你会有帮助:https://help.aliyun.com/document_detail/32077.html?spm=a2c4g.11186623.6.1220.1e4177a3nVKaEc

参考文档:(https://help.aliyun.com/document_detail/92883.html?spm=a2c4g.11186623.6.670.5265350asB84kG)

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
好的,以下是一个简单的微信小程序中图片上传到阿里云OSS的例子: 1. 在微信小程序中,使用wx.chooseImage()方法选择需要上传的图片,并将其保存在本地变量tempFilePaths中。 ``` wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths; // 上传图片阿里云OSS uploadImage(tempFilePaths[0]); } }) ``` 2. 编写上传图片的函数uploadImage(),其中需要设置header、formData、name、url等参数,并调用wx.uploadFile()方法上传图片。 ``` function uploadImage(filePath) { // 阿里云OSS的Bucket名称和上传文件夹名称 var bucketName = 'your-bucket-name'; var folderName = 'your-folder-name/'; // 生成上传文件的唯一key var timestamp = new Date().getTime(); var key = folderName + timestamp + '-' + Math.floor(Math.random() * 10000) + '.jpg'; // 生成OSS的上传接口地址 var policyBase64 = 'your-policy-base64'; var signature = 'your-signature'; var aliyunUrl = 'https://' + bucketName + '.oss-cn-hangzhou.aliyuncs.com'; // 设置header和formData var header = { 'content-type': 'multipart/form-data' }; var formData = { 'key': key, 'policy': policyBase64, 'OSSAccessKeyId': 'your-access-key-id', 'success_action_status': '200', 'signature': signature }; // 调用wx.uploadFile()方法上传图片 wx.uploadFile({ url: aliyunUrl, filePath: filePath, name: 'file', header: header, formData: formData, success: function(res) { // 上传成功,获取图片URL地址 var imageUrl = aliyunUrl + '/' + key; console.log('上传成功,图片URL地址为:' + imageUrl); }, fail: function(res) { // 上传失败 console.log('上传失败:' + res.errMsg); } }) } ``` 需要注意的是,以上代码仅为一个示例,实际使用时需要按照阿里云OSS的规定进行设置,并在后端服务中编写相应的签名验证逻辑。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值