微信小程序对接阿里云OSS并实现多张图片和视频的上传

本文详细介绍了如何使用微信小程序上传图片和视频到阿里云OSS存储空间,并进一步上传至公司后台服务器的过程。文章提供了从选择文件、获取上传参数到递归上传的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做微信小程序,涉及到图片(多张)和视频(一条)上传到阿里云服务器,上传完阿里云服务器后再上传至应用服务器也就是公司的后台服务器,其过程也是有点复杂的,所以记录下。

开通oss服务和创建oss存储空间就不说了,配置跨域规则的相关工作后端已经完成了,由于我是负责前端部分的,所以我就从前端说起,如果你也是初次涉及此方面内容,请耐心看下去会帮助你解决问题的。话不多说,直接进入主题。

初次涉及,网上找了网页版的样例,试着了解下

解压打开index.html,长这样

找到upload.js把accessid, accesskey, host三个参数改成你的,这个失效时间可能是在index.html页面上传文件时显示403的原因之一。

打开代码示例中的index.html文件,上传文件到oss存储空间,通过浏览器查看请求信息,这里有两个参数是要用到小程序中上传文件的,我是先把这两个参数在小程序中调用测试可以上传成功了, 再走后面的流程的。但这只是测试,正常情况下需要通过调取后台接口获取上传文件所需的参数(fileName, policy, accessKeyId, signature,host)

接下来就是通过小程序上传图片到oss中了

在小程序中的测试流程:


upload: function(){
   wx.chooseImage({
     success: function (res) {
       var tempFilePaths = res.tempFilePaths
       console.log('chooseImage success, temp path is: ', tempFilePaths[0])
       wx.uploadFile({
         url: 'http://www.ieesee.cn',
         filePath: tempFilePaths[0],
         name: 'file',
         formData: {
           name: tempFilePaths[0],
           key: "${filename}", ////上传图片的名字和路径(默认路径根目录,自定义目录:xxx/xxx.png)
           policy: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",//测试的网页版打开F12那获得
           OSSAccessKeyId: "xxxxxxxxxxxxxxxx",
           success_action_status: "200",
           signature: "xxxxxxxxxxxxxxxxxxxxxxxxxx",//测试的网页版打开F12那获得
         },
         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
            })
         },
       })
     }
   })
 }

以上基本了解了微信小程序的上传到阿里云OSS的流程,下面开始走正式流程

----------------------------------------------------------------------------------------------------------------------------------------------------------------

界面就是先简单的写了两个按钮

 

 调用接口获取上传文件所需参数:fileName, policy, accessKeyId, signature,host上传至阿里云,待全部文件上传完毕后再将上传至应用服务器(后台服务器)。

要注意的点:wx.uploadFile只能同时上传一个文件,不然会报错,网上很多都用的循环,但是本人亲测用for循环不行,上传的图片有重复的顺序也出现错误,但是问题还是有的,用递归上传完美解决。

 

  /* 函数描述:作为上传文件时递归上传的函数体体;
   * 参数描述: 
   * 内容类型 1:视频 2:图片
   * tempFiles是文件路径数组
   * successUp是成功上传的个数->0
   * failUp是上传失败的个数->0
   * i是文件路径数组的指标->0
   * length是文件路径数组的长度
   */
//获取上传文件所需参数
  getUploadInfo(contentType, tempFiles, successUp, failUp, i, length) {
    var that = this;
    var contentExt = tempFiles[i].tempFilePath.substr(tempFiles[i].tempFilePath.lastIndexOf('.') + 1);
    var url = `${app.globalData.domain}/uploadContent/getOssUploadInfo`;
    var data = {
      uid: wx.getStorageSync("uid"),
      openid: wx.getStorageSync("openId"),
      contentType: contentType,
      contentSubType: that.data.contentSubType,
      contentExt: contentExt  //图片类型:jpg. png ... 或者 视频类型:mp4.....
    };
    util.post(url, data).then((res) => {
      if (res.data.retCode == 0) {
        that.setData({
          fileName: res.data.fileName,
          policy: res.data.policy,
          accessKeyId: res.data.accessKeyId,
          signature: res.data.signature,
          host: "https://" + res.data.host,
        })
        //获取完所需参数再选择文件上传
        that.uploadFile(contentType, tempFiles, successUp, failUp, i, length);
      } else {
        wx.showModal({
          title: '提示',
          content: '[' + res.data.retCode + ']' + res.data.retMsg,
          showCancel: false,
        })
      }

    }).catch((error) => {
      console.log(error);
    })
  },

 //将文件上传到阿里云
  uploadFile(contentType, tempFiles, successUp, failUp, i, length) {
    var that = this;
    wx.uploadFile({
      url: that.data.host,
      filePath: tempFiles[i].tempFilePath,
      name: 'file',
      formData: {
        name: tempFiles[i].tempFilePath,
        key: that.data.fileName, //上传图片的名字和路径(默认路径根目录,自定义目录:xxx/xxx.png)
        policy: that.data.policy,
        OSSAccessKeyId: that.data.accessKeyId,
        success_action_status: "200",
        signature: that.data.signature,
      },
      success: function (res) {
        console.log(res);
        successUp++;
        wx.showToast({
          title: "上传成功",
          icon: 'success',
          duration: 1000,
        })
        //已经上传完成的图片数组
        var hasUploadedImgsArr = that.data.hasUploadedImgsArr;
        var imgUrl = that.data.host + '/' + that.data.fileName;
        hasUploadedImgsArr.push(imgUrl);
        that.setData({
          hasUploadedImgsArr: hasUploadedImgsArr
        })
      },
      fail: function (errMsg) {
        failUp++
        console.log('upladImage fail, errMsg is: ', errMsg);
        wx.showToast({
          title: "上传失败",
          duration: 1000
        })
      },
      complete() {
        i++;
        if (i == length) {
          //所有图片上传完成以后再上传至应用服务器
          console.log('总共' + successUp + '张上传成功,' + failUp + '张上传失败!');
          if (contentType == 1) { //1视频  2图片
            that.submitVideo(); //将视频上传至应用服务器
          } else { //图片
            that.submitImage();  //将图片上传至应用服务器
          }
        } else {
          //递归调用getUploadInfo函数
          that.getUploadInfo(contentType, tempFiles, successUp, failUp, i, length);
        }

      }
    })
  },


  //提交视频内容至应用服务器
  submitVideo() {
    var that = this;
    var url = `${app.globalData.domain}/uploadContent/submitVideo`;
    var data = {
      uid: wx.getStorageSync("uid"),
      openid: wx.getStorageSync("openId"),
      videoTitle: "视频test",
      videoUrl: this.data.host + '/' + this.data.fileName,
    }

    util.post(url, data).then((res) => {
      that.setData({
        hasUploadedImgsArr: []
      })
      if (res.data.retCode == 0) {
        console.log("提交视频内容至应用服务器成功");
      } else {
        wx.showModal({
          title: '提示',
          content: '[' + res.data.retCode + ']' + res.data.retMsg,
          showCancel: false,
        })
      }
    }).catch((error) => {
      console.log(error);
    })

  },

  //提交图片至应用服务器
  submitImage() {
    var imageList = [],
      listObj = null, that = this;
    for (let i = 0; i < this.data.hasUploadedImgsArr.length; i++) {
      listObj = {
        "url": this.data.hasUploadedImgsArr[i],
        "desc": `图片test${i + 1}`
      };
      imageList.push(listObj);
    }
    console.log(imageList);
    var url = `${app.globalData.domain}/uploadContent/submitImage`;
    var data = {
      uid: wx.getStorageSync("uid"),
      openid: wx.getStorageSync("openId"),
      imageTitle: "上传图片test",
      imageCover: imageList[0].url,
      imageList: JSON.stringify(imageList)
    }

    util.post(url, data).then((res) => {
      that.setData({
        hasUploadedImgsArr: []
      })
      if (res.data.retCode == 0) {
        console.log("提交图片至应用服务器成功");
      } else {
        wx.showModal({
          title: '提示',
          content: '[' + res.data.retCode + ']' + res.data.retMsg,
          showCancel: false,
        })
      }
    }).catch((error) => {
      console.log(error);
    })
  },

 //上传图片(多张)
  uploadImage() {
    console.log("上传图片。。。。");
    this.setData({
      contentSubType: 1
    })
    var that = this;
    wx.chooseMedia({
      count: 9,
      mediaType: ['image'],
      sourceType: ['album', 'camera'],
      maxDuration: 30,
      camera: 'back',
      success: function (res) {
        console.log(res);
        var tempFiles = res.tempFiles;
        that.setData({
          imageFiles: tempFiles
        })
        var contentType = 2; //1视频  2图片
        that.getUploadInfo(contentType, tempFiles, 0, 0, 0, tempFiles.length);
      },
      fail: function (error) {
        console.log(error);
      }
    });
  },


  //上传视频(一条)
  uploadVideo() {
    this.setData({
      contentSubType: 1
    })
    var that = this;
    wx.chooseMedia({
      count: 1,
      mediaType: ['video'],
      sourceType: ['album', 'camera'],
      maxDuration: 30,
      camera: 'back',
      success: function (res) {
        console.log(res);
        var contentType = 1; //1视频  2图片
        var tempFiles = res.tempFiles;
        that.getUploadInfo(contentType, tempFiles, 0, 0, 0, tempFiles.length);
      },
      fail: function (error) {
        console.log(error);
      }
    })
  },

到这,流程就已经完了,功能也完成啦!

 

 

 

 

<think>好的,我现在需要回答用户关于如何将阿里云微信小程序进行链接的问题。用户可能希望了解如何将阿里云的服务集成到微信小程序中,或者如何利用阿里云的后端资源支持小程序的运行。 首先,我需要确认用户的具体需求是什么。链接微信小程序可能涉及多个方面,例如后端服务器的部署、数据库的使用、文件存储、API接口的设置等。用户可能想知道阿里云提供了哪些服务来支持这些需求,以及具体的操作步骤。 接下来,我需要回忆阿里云的相关服务文档。阿里云作为国内领先的云服务提供商,提供了丰富的产品,如ECS(云服务器)、RDS(关系型数据库)、OSS(对象存储)、API网关、函数计算等,这些都是小程序后端常用的服务。同时,微信小程序的开发需要HTTPS接口,因此SSL证书服务也可能涉及。 然后,我需要考虑用户可能的痛点。比如,用户可能对如何配置服务器、如何保证安全性、如何优化性能等问题存在疑问。另外,微信小程序的前端后端通信需要遵循微信的安全规范,比如域名备案、HTTPS等,这些都需要在阿里云上进行相应的配置。 可能还需要分步骤说明,例如:注册阿里云账号开通必要服务、部署后端服务器、配置数据库、设置API接口、绑定域名SSL证书、在微信小程序中调用接口等。每个步骤需要简明扼要地解释,同时提醒注意事项,如备案要求、安全组配置等。 同时,可能需要比较阿里云与其他云服务(如腾讯云)在微信小程序集成上的优势或差异,但用户的问题集中在阿里云,所以重点应放在阿里云的具体操作上。 还需要考虑用户的技术水平,如果用户是开发者,可能需要更详细的步骤技术细节;如果是非技术人员,可能需要更概括性的介绍。根据之前的对话历史,用户询问过模型训练部署的问题,可能有一定的技术背景,但不确定是否熟悉云服务配置,因此需要平衡深度易懂性。 最后,确保回答结构清晰,分点列出,帮助用户逐步理解操作,同时引用官方文档或最佳实践,确保信息的准确性。可能还需要提供常见问题的解决方法,如跨域问题、HTTPS配置失败等。</think>将阿里云微信小程序集成主要涉及后端服务部署API对接,以下是关键步骤注意事项: --- ### **一、基础架构设计** 1. **技术栈选择** - 前端:微信小程序原生开发/Uniapp框架 - 后端:阿里云ECS(Node.js/Java)或Serverless(函数计算FC) - 数据库:阿里云RDS(MySQL版)或云数据库MongoDB - 存储:OSS对象存储(图片/视频资源) - 安全:SSL证书服务+WAF防火墙 2. **通信流程** ``` 小程序端 → HTTPS请求 → 阿里云API网关 → 后端服务(ECS/FC) → 数据库/存储 ``` --- ### **二、具体对接步骤** #### **步骤1:域名准备与备案** 1. 在阿里云购买域名(如`api.yourdomain.com`) 2. 完成ICP备案(必需步骤,约10-20个工作日) 3. 申请免费SSL证书(阿里云SSL证书服务→DV单域名证书) #### **步骤2:后端服务部署** - **方案A:ECS服务器部署** 1. 创建ECS实例(推荐配置:2核4G,CentOS 7.6) 2. 安装Node.js环境: ```bash curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash - sudo yum install -y nodejs ``` 3. 部署Express.js示例代码: ```javascript const express = require('express'); const app = express(); app.get('/api/data', (req, res) => { res.json({ message: "阿里云接口响应成功" }); }); app.listen(3000, () => console.log('服务启动')); ``` - **方案B:Serverless函数计算** 1. 创建FC函数(运行环境Node.js 14) 2. 编写HTTP触发器函数: ```javascript exports.handler = (event, context, callback) => { callback(null, { statusCode: 200, body: JSON.stringify({ data: "来自函数计算的响应" }) }); }; ``` #### **步骤3:API网关配置** 1. 创建API分组 → 绑定已备案域名 2. 定义API路径(如`/user/login`)→ 后端服务指向ECS内网IP或FC函数 3. 开启「APP认证」→ 生成AppKey/AppSecret供小程序调用 #### **步骤4:小程序端调用** ```javascript // 小程序wx.request调用示例 wx.request({ url: 'https://api.yourdomain.com/user/login', method: 'POST', data: { username: 'test', password: '123' }, success: (res) => { console.log(res.data); } }) ``` --- ### **三、关键问题解决方案** 1. **跨域访问(CORS)问题** - 在API网关添加响应头: ``` Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,POST ``` 2. **高发场景优化** - 接入阿里云CDN加速静态资源 - 使用Redis云数据库缓存热点数据 3. **敏感数据加密** - 使用阿里云KMS密钥管理服务 - 小程序端配合`crypto-js`库进行AES加密 --- ### **四、成本控制建议** | 服务 | 推荐规格 | 月成本估算 | |--------------|-------------------------|------------| | ECS | 共享型n4 2核4G | ¥110 | | RDS MySQL | 基础版1核1G | ¥85 | | OSS存储 | 标准型50GB | ¥9 | | 函数计算FC | 按调用次数计费(百万次)| ¥1.3 | --- ### **五、调试与监控** 1. **日志排查** - ECS使用`tail -f /var/log/messages` - FC函数控制台查看实时日志 2. **性能监控** - 接入阿里云ARMS应用监控 - 配置小程序错误告警(HTTP错误率>5%触发短信通知) --- ### **六、备案特殊说明** - 微信小程序要求服务器域名**必须完成ICP备案** - 阿里云备案加速技巧: 1. 提前准备营业执照/身份证正反面扫描件 2. 使用阿里云APP进行人脸识别验证 3. 选择「首次备案」通道提交(比新增备案更快) --- 通过上述方案,通常可在3个工作日内完成基础对接。建议先通过[阿里云小程序云](https://developer.aliyun.com/miniapp)的模板快速搭建Demo,再逐步扩展功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值