微信小程序将资源上传阿里云OSS

    我们在实际业务中经常能遇到将各种资源上传到云服务器,这样做第一是能更好的管理我们的比如图片资源,视频,音频资源等,同时也能节约公司的网络带宽,减少各种资源随着时间的推移资源越来越多造成服务器的硬盘压力过大。还有一个重要的原因是可以保护我们的资源被其他人盗用的问题.下面我就来介绍在小程序中如何将各种资源直传到阿里云OSS。话不多说直接上代码 

小程序 index.js  

在每次调用读取文件之前之前,需要重新获得零时授权,防止授权凭证过期导致无法上传

import UploadAliOss from "../../common/aliyunOss/uploadOssClass";
const AliyunOss = new UploadAliOss();

  // 读取文件之前  需要重新获得零时授权  
    async beforeRead(event) {
        await AliyunOss.GetOSSKeyInfo();
        Toast.loading({
            message: '上传中...',
            forbidClick: true,
            duration: 0
        });
        event.detail.callback(true);
    },

读取文件之后调用上传方法,

  // 文件读取完成后
    async afterRead(event) {
        const {
            file
        } = event.detail;
        const {
            Code,
            Data
        } = await AliyunOss.uploadFile(file.url)
        console.log("AliyunOss.uploadFile", Code, Data);
        if (Code == 200) {
            const imgInfo = new ImgClass(BaseImgUrl + Data);
            Toast.clear();
            this.setData({
                fileList: [...this.data.fileList, imgInfo]
            })
        } else {
            Toast.fail('上传失败');
        }

    },

uploadOssClass.js  注意 uploadImageUrl 这个地址需要配置到,合法域名中

const crypto = require('crypto.js');
const base64 = require('base64.js'); // Base64,hmac,sha1,crypto相关算法

import {
    GetOSSKey
} from "../../api/api";

const uploadImageUrl = "xxxxxxxx"; //你的阿里云OSS地址  在你当前小程序的公众号后台的uploadFile 合法域名也要配上这个域名

class UploadAliOss {
    constructor(options = {}) {
        // 限制参数的生效时间,单位为小时,默认值为1。
        this.timeout = options.timeout || 1;
        // 限制上传文件的大小,单位为MB,默认值为10。
        this.maxSize = options.maxSize || 10;
    }
    // 服务端获取上传秘钥 和 临时授权
    async GetOSSKeyInfo() {
        const result = await GetOSSKey();
        this.securityToken = JSON.parse(result).SecurityToken;
        this.accessKeyId = JSON.parse(result).AccessKeyId;
        this.accessKeySecret = JSON.parse(result).AccessKeySecret;
    };
    // 上传文件  filePath 文件的临时地址 dir 文件夹 生成的文件反正那个文件夹下 方便管理
    uploadFile(filePath, dir = "xlya") {
        return new Promise((resolve, reject) => {
            if (!filePath) {
                reject({
                    Code: 501,
                    Msg: "上传失败,请稍后再试"
                })
                return
            }
            // 设置文件存放的地址以及为文件命名 随机数防止文件重名被覆盖
            const aliyunFileKey = dir + "/" + new Date().getTime() + Math.floor(Math.random() * 150);
            wx.uploadFile({
                url: uploadImageUrl, //开发者服务器 url
                filePath: filePath, //要上传文件资源的路径
                name: 'file', //必须填file
                formData: {
                    'key': aliyunFileKey, // 设置文件上传至OSS后的文件路径
                    'success_action_status': '200',
                    ...this.getUploadParams()
                },
                success: function (res) {
                    if (res.statusCode == 200) {
                        resolve({
                            Code: 200,
                            Data: "/" + aliyunFileKey
                        })
                    } else {
                        reject({
                            Code: 501,
                            Msg: "上传失败,请稍后再试"
                        })
                    }
                },
                fail: function (err) {
                    reject({
                        Code: 501,
                        Msg: "上传失败,请稍后再试"
                    })
                },
            })
        })
    }
    // 获取上传接口需要的参数
    getUploadParams() {
        const policy = this.getPolicyBase64();
        const signature = this.signature(policy);
        return {
            OSSAccessKeyId: this.accessKeyId,
            policy: policy,
            signature: signature,
            'x-oss-security-token': this.securityToken,
        };
    }
    getPolicyBase64() {
        let date = new Date();
        // 设置policy过期时间。
        date.setHours(date.getHours() + this.timeout);
        let srcT = date.toISOString();
        const policyText = {
            expiration: srcT,
            conditions: [
                // 限制上传文件大小。
                ["content-length-range", 0, this.maxSize * 1024 * 1024],
            ],
        };
        return base64.encode(JSON.stringify(policyText));
    }
    // 获取签名
    signature(policyBase64) {
        const accesskey = this.accessKeySecret;
        const bytes = crypto.HMAC(crypto.SHA1, policyBase64, accesskey, {
            asBytes: true
        });
        const signature = crypto.util.bytesToBase64(bytes);
        return signature;
    }

}

export default UploadAliOss

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的微信小程序中图片上到阿里云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的规定进行设置,并在后端服务中编写相应的签名验证逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值