尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

小程序/uniapp使用阿里云serverless进行oss客户端签名直传实践

小程序/uniapp使用阿里云serverless进行oss客户端签名直传实践
📅 发布时间:2026/6/20 5:31:50

 最近在弄小程序/uniapp使用阿里云serverless进行oss客户端签名直传,因为官方文档的示例代码瞎几把写看不明白浪费了很多时间摸索,这里记录下:

其实大概半年前用php对接过,也是很顺利。。。

 node后端代码:

const config = require('../../config');
const OSS = require('ali-oss');module.exports = class AliOSS {static Bucket = 'hejiu-tools';static UrlTimeout = 600;static getClient() {return new OSS({accessKeyId: config.oss.RamAK,accessKeySecret: config.oss.RamSK,region: config.oss.RegionId,bucket: AliOSS.Bucket,secure: true, // https});}// 小程序端fileUpload只支持post,这个玩意强制put,弃了。static async getSignature(fileName) {const client = AliOSS.getClient();const response = await client.signatureUrlV4('PUT', 60*1000,{headers: {'content-type': 'xxx', // 默认是application/octet-stream,需要换成文件的content-type},}, fileName);return response;}// 表单上传签名,小程序端fileUpload只支持post上传static async getPostPolicy() {const client = AliOSS.getClient();const policy = {expiration: new Date(Date.now() + 10*60000).toISOString(), // 10分钟后过期conditions: [["content-length-range", 0, 104857600] // 文件大小限制100MB]};const formData = client.calculatePostSignature(policy);return {host: `https://${AliOSS.Bucket}.${config.oss.RegionId}.aliyuncs.com`,policy: formData.policy,signature: formData.Signature,OSSAccessKeyId: formData.OSSAccessKeyId,expire: Date.now() + 600000};}}

 小程序前端代码:

获取签名:

// 后端使用了serverless
import MPServerless from '@alicloud/mpserverless-sdk'
import config from '../../../config/config';export default class Serverless {static instance;isAuthorized = false;constructor(){if (!Serverless.instance) {this.mpsl = new MPServerless({uploadFile: uni.uploadFile,request: uni.request,getAuthCode: this._getAuthCode,}, config.sl); // config.sl: serverless配置Serverless.instance = this;this._authorize();}return Serverless.instance;}_authorize() {if (!this.isAuthorized) {// 进行匿名授权this.mpsl.init({authorType: 'anonymous'});this.isAuthorized = true;}}_getAuthCode(){return new Promise(async (resolve, reject) => {uni.login({provider: 'weixin',success: async (res) => {console.log('login success:', res);const authCode = res.code;if(authCode) resolve(authCode);else reject('获取授权码失败');},fail: (err) => {console.log('login fail:', err);}})})}request(url='', params={}, loading=false){return new Promise(async (resolve, reject) => {console.log('SL request:', url, params);const [ n, mod, method ]  = url.split('/');if(!mod || !method) return reject('Invalid url');loading && uni.showLoading({ title: '加载中...' });this.mpsl.function.invoke('slapi', { module: mod, method, ...params}).then(res => {if(res.success) resolve(res.result);reject(res.result);}).finally(() => uni.hideLoading());});}
}// 这里才是开始获取签名
(new Serverless()).request('/aliCloud/getPostPolicy', {}).then(res => {uni.hideLoading();console.log(res);if(res.code) return uni.showToast({ title: 'OSS服务异常,请稍重试!' });this.uploadFile(res.data);});

上传文件:

		uploadFile(ossData={}) {const { tempFile } = this;const fileName = generateUUID()+`.${tempFile.extname}`;const filePath = 'dir/'+fileName; // this.$g.tempFile.namereturn uni.uploadFile({url: config.oss.host,name: 'file',filePath: tempFile.path,formData: Object.assign({key: filePath}, ossData),success: (res) => {console.log(res);if(res?.statusCode >= 300) return this.$g.info('上传失败');this.$g.info('上传成功');this.path = config.oss.host+`/${filePath}`;this.fileName = fileName;// this.encodeData(fileName);},fail: (err) => {// console.warn(err);this.$g.info('上传失败');}});},

 

相关新闻

  • CF241B
  • 蒟蒻入园
  • Level 6 → Level 7

最新新闻

  • 2026赢客网络综合实力风云榜,价格透明口碑推荐不踩雷 - mypinpai
  • 商用车电泳漆品牌哪家靠谱 2026年市场口碑解析 - 品牌排行榜
  • OpCore Simplify:10分钟搞定黑苹果配置的智能工具终极指南
  • MC68HC912BD32串行通信与Byteflight协议深度解析
  • Switch虚拟Amiibo终极指南:免费解锁游戏隐藏内容
  • 2026年初中毕业学西点推荐好的学校用户力荐 - mypinpai

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号