微信小程序上传oss(sts直传)

本文档介绍如何将微信小程序的图片上传方式改为阿里云OSS的STS直传。通过运行DEMO获取所需参数,特别是signature和policy,同时提供了一个通用的Crypo.js和oss.js文件辅助实现。在实际应用中,确保正确传递所有参数,包括从后台获取的token。

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

 

最近有个需求,说要把上传图片的方式改下,改成上传到oss上面

文档地址:

https://help.aliyun.com/document_detail/92883.html?spm=5176.11065259.1996646101.searchclickresult.419a56d2Xam3Py

1.关键一步=>你可以先试着把demon跑通

2 。跑通demon主要是为了获取这几个怎么来,方便小程序使用

3 看着那么都引用的js,看着就头疼

为大家整理个公用的 Crypyo.js

/*!
 * Crypto-JS v1.1.0
 * http://code.google.com/p/crypto-js/
 * Copyright (c) 2009, Jeff Mott. All rights reserved.
 * http://code.google.com/p/crypto-js/wiki/License
 */

var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

// Global Crypto object
const Crypto = {};

// Crypto utilities
Crypto.util = {

  // Bit-wise rotate left
  rotl: function (n, b) {
    return (n << b) | (n >>> (32 - b));
  },

  // Bit-wise rotate right
  rotr: function (n, b) {
    return (n << (32 - b)) | (n >>> b);
  },

  // Swap big-endian to little-endian and vice versa
  endian: function (n) {

    // If number given, swap endian
    if (n.constructor == Number) {
      return util.rotl(n, 8) & 0x00FF00FF |
        util.rotl(n, 24) & 0xFF00FF00;
    }

    // Else, assume array and swap all items
    for (var i = 0; i < n.length; i++)
      n[i] = util.endian(n[i]);
    return n;

  },

  // Generate an array of any length of random bytes
  randomBytes: function (n) {
    for (var bytes = []; n > 0; n--)
      bytes.push(Math.floor(Math.random() * 256));
    return bytes;
  },

  // Convert a string to a byte array
  stringToBytes: function (str) {
    var bytes = [];
    for (var i = 0; i < str.length; i++)
      bytes.push(str.charCodeAt(i));
    return bytes;
  },

  // Convert a byte array to a string
  bytesToString: function (bytes) {
    var str = [];
    for (var i = 0; i < bytes.length; i++)
      str.push(String.fromCharCode(bytes[i]));
    return str.join("");
  },

  // Convert a string to big-endian 32-bit words
  s
### 使用Node.js实现微信小程序直传阿里云OSS 为了使微信小程序能够直接上传文件至阿里云对象存储服务(OSS),需构建一个安全可靠的STS临时授权机制。此过程中,Node.js作为后端技术栈来处理请求并返回必要的凭证给前端。 #### 创建STSToken接口 通过Node.js创建API用于获取临时访问令牌(STS Token)。这涉及到调用阿里云的安全令牌服务(STS)[^3]。下面展示如何利用`@alicloud/sts`库完成这一操作: ```javascript const STS = require('@alicloud/sts'); // 初始化客户端实例 async function getStsToken() { const client = new STS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret' }); try { let res = await client.assumeRole({ RoleArn: "acs:ram::123456789012****:role/aliyunosstokengeneratorrole", RoleSessionName: "session-name" }); console.log('Success:', JSON.stringify(res)); return res; } catch (e) { console.error('Error:', e); } } ``` 上述代码片段展示了怎样配置和发送假设角色(AssumeRole)请求以获得临时认证信息。 #### 返回Policy与Signature 当从小程序接收到上传请求时,除了提供临时密钥外,还需要生成相应的策略(Policy)以及基于该政策计算出的签名(Signature)。这部分工作通常由后端负责,在这里即指Node.js应用部分: ```javascript function generateUploadParams(fileName){ var policyText = {"expiration": expirationTime, "conditions":[["content-length-range", 0, maxSize], ["starts-with", "$key", dir]] }; var base64policy = Buffer.from(JSON.stringify(policyText)).toString('base64'); var signature = crypto.createHmac('sha1', secret).update(base64policy).digest('base64'); return {bucket, key: `${dir}${fileName}`, OSSAccessKeyId, host, policy: base64policy, signature}; } ``` 这段脚本说明了构造上传所需参数的过程,包括但不限于目标路径(`key`)、桶名(`bucket`)等,并最终形成了一套完整的上传元数据集[^1]。 #### 安全注意事项 在整个流程设计中,务必重视安全性考量。具体措施如下: - 不要在任何地方暴露长期有效的Access Key ID 和 Secret; - 对于每次会话仅分配最小权限范围内的临时身份验证凭据; - 设置合理的过期时间限制,防止滥用风险;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值