uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS

这篇具有很好参考价值的文章主要介绍了uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

这两天有个需求,要微信小程序跟QQ小程序通过阿里的OSS储存,存放静态资源,遇到了挺多问题,记录一下~~~

文档:此处

服务器签名

其实这个是被误导了,也怪自己没有仔细看文档,不该有这一步,但是做了就记录一下,正好多了解nodejs环境与浏览器环境 API的差别。

服务器直传里面的方法,失败了:浏览器环境没有Buffer 对象
一下是OSS中的DEMO:

BUG1:浏览器环境没有Buffer对象

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

只能找方法生成

// 创建一个类似于 Node.js Buffer 的类
class Buffer2 {
    constructor(data) {
        this.data = data;
    }

    // 将string类型转成Buffer数组
    static from(source) {
        if (typeof source === 'string') {
            // 如果源是字符串,则将其编码为指定的编码格式
            const encoder = new TextEncoder();
            let encodedData = encoder.encode(source)
            console.log("encodedData:", encodedData);
            return new Buffer2(encodedData)

            const hexString = Array.from(encodedData).map(byte => byte.toString(16).padStart(2, '0'));
            return new Buffer2(hexString);
        } else {
            throw new Error("不知道什么数据...")
        }
    }


    base64Encode(str) {
        const base64Chars =
            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        let result = '';

        for (let i = 0; i < str.length; i += 3) {
            const char1 = str.charCodeAt(i);
            const char2 = str.charCodeAt(i + 1);
            const char3 = str.charCodeAt(i + 2);

            const byte1 = char1 >> 2;
            const byte2 = ((char1 & 3) << 4) | (char2 >> 4);
            const byte3 = ((char2 & 15) << 2) | (char3 >> 6);
            const byte4 = char3 & 63;

            result +=
                base64Chars.charAt(byte1) +
                base64Chars.charAt(byte2) +
                base64Chars.charAt(byte3) +
                base64Chars.charAt(byte4);
        }

        // Handle padding
        const padding = str.length % 3;
        if (padding === 1) {
            result = result.slice(0, -2) + '==';
        } else if (padding === 2) {
            result = result.slice(0, -1) + '=';
        }

        return result;
    }

    toString(encoding = 'base64') {
        if (encoding === 'base64') {
            const binary = [];
            const bytes = new Uint8Array(this.data);

            for (let i = 0; i < bytes.length; i++) {
                binary.push(String.fromCharCode(bytes[i]));
            }

            return this.base64Encode(binary.join(''));
        } else {
            throw new Error('Unsupported encoding');
        }
    }
}


let obj = { a: 1, b: 2 }
let buf = Buffer2.from(JSON.stringify(obj))
console.log("buf:", buf);
console.log(buf.toString("base64"));

用简单的对象obj进行测试~

浏览器环境测试自定义Buffer

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

原生node环境使用原生Buffer

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序
结果一样了~~~

=====

接下来尝试生成DEMO例子中的签名,看看结果一不一样
这里为了数据比对,就将DEMO中的srcT(源代码是实时时间)写死了。
uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

原生node环境 生成签名

const crypto = require("crypto-js");

class MpUploadOssHelper {
    constructor(options) {
        this.accessKeyId = options.access_key_id;
        this.accessKeySecret = options.access_key_secret;
        // 限制参数的生效时间,单位为小时,默认值为1。
        this.timeout = options.timeout || 1;
        // 限制上传文件的大小,单位为MB,默认值为10。
        this.maxSize = options.maxSize || 10;
    }

    createUploadParams() {
        const policy = this.getPolicyBase64();
        const signature = this.signature(policy);
        return {
            OSSAccessKeyId: this.accessKeyId,
            policy: policy,
            signature: signature,
        };
    }

    getPolicyBase64() {
        let date = new Date();
        // 设置policy过期时间。
        date.setHours(date.getHours() + this.timeout);
        let srcT = date.toISOString();
        console.log(srcT);
        srcT = '2023-09-08T06:59:34.489Z'
        const policyText = {
            expiration: srcT,
            conditions: [
                // 限制上传文件大小。
                ["content-length-range", 0, this.maxSize * 1024 * 1024],
            ],
        };
        console.log("policyText:", policyText);
        const buffer = Buffer.from(JSON.stringify(policyText));
        console.log("sss", buffer);
        return buffer.toString("base64");
    }

    signature(policy) {
        return crypto.enc.Base64.stringify(
            crypto.HmacSHA1(policy, this.accessKeySecret)
        );
    }
}

const mpHelper = new MpUploadOssHelper({
    access_key_id: "xxxxxxxxxxxxxxxx",
    access_key_secret: "xxxxxxxxxxxxxxxxxxxxxxxx"
})

// 生成参数。
const params = mpHelper.createUploadParams();
console.log(params);

结果如下:

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

微信小程序 生成签名

都是使用一样的代码,只不过小程序用了自定义的class Buffer2

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

到这里了,就可以证明基本没问题了~
那试试发送请求有无问题???

肯定有问题啦~~~
参考官网的wx.uploadFile,一系列操作后:
uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序
该错误与下方的客户端签名直传一样~

WAServiceMainContext.js?t=wechat&s=1694156563411&v=3.0.1:1 TypeError: Cannot read property 'sigBytes' of undefined
    at new init (vendor.js? [sm]:43703)
    at Object.HmacSHA1 (vendor.js? [sm]:41454)
    at MpUploadOssHelper.signature (ossHelper.js? [sm]:93)
    at MpUploadOssHelper.createUploadParams (ossHelper.js? [sm]:61)
    at _callee$ (uploadFile2.js? [sm]:45)
    at s (regeneratorRuntime.js:1)
    at Generator.<anonymous> (regeneratorRuntime.js:1)
    at Generator.next (regeneratorRuntime.js:1)
    at asyncGeneratorStep (asyncToGenerator.js:1)
    at c (asyncToGenerator.js:1)(env: Windows,mp,1.06.2308291; lib: 3.0.1)

如下~


客户端签名

参考:此处

BUG1:crypto-js 库 sigBytes

调用 crypto.HmacSHA1 出现 sigBytes

oss uniapp 客户端直传,显示 TypeError: Cannot read property ‘sigBytes’ of undefined

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序
追溯源头,因为使用了crypto-js

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

找到问题了~是自己的问题,给的提示也太那个了,console.log 一下参数。。。
uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序
crypto.HmacSHA1方法中,第二个参数为undefined...


之前实在搞不定,决定去找客服找解决方案,也记录一下,~~~

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

微信小程序调用OSS SDK

在vue项目中通过npm i ali-oss,已经可以实现上传,具体可以参考官网DEMO
官网:此处

Bug1:微信API导出的文件只是path

并不是浏览器常用的blob
uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

Bug2:微信小程序中没有Blob对象

想着自己通过uni.getFileSystemManager() 获取本地文件权限,再转成Blob对象,好家伙,微信开发者工具直接找不到,NND~~~

uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

后来继续看到了文档,这OSS售后,沃日 T。T …
uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS,小程序,uni-app,微信小程序

总结

大平台,看官方文档就好了,不要相信自己~文章来源地址https://www.toymoban.com/news/detail-700982.html

到了这里,关于uniapp 上传静态资源-- 微信小程序跟QQ小程序上传静态资源到阿里的对象存储 OSS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uniapp微信小程序实现大文件上传 分片上传 进度条

    uniapp微信小程序实现大文件上传 分片上传 进度条

    一、安装   二、页面引入  三、实现功能(重要)         1.获取图片的路径         2.设置分片的大小         3.将数据放入 四、实现上传进度条 全部函数js 五、修改npm的源码,处理请求源码中请求所携带的参数问题,以及报错处理(重要) 修改npm后的源码。

    2024年02月03日
    浏览(13)
  • uniapp开发的微信小程序如何上传至微信小程序平台-完整简单步骤

    uniapp开发的微信小程序如何上传至微信小程序平台-完整简单步骤

    这个id请登录微信小程序号   设置中查看 成功上传。 message:Error: 系统错误,错误码:80051,source size 3743KB exceed max limit 2MB  如果这样报错可以尝试分包或者减至2M以内。 分包方法参考此博文 uniapp如何分包 分包配置后无法读取static文件夹_谨言不言的博客-CSDN博客_uniapp 分包

    2024年02月16日
    浏览(151)
  • uniApp、微信小程序上传单个文件及多个文件

    使用官方api - uni.uploadFile 这是单个文件上传写法 这是上传多个文件写法 由于没有多个上传文件的方法,目前只能通过遍历的方式来进行多文件上传

    2024年04月16日
    浏览(44)
  • uniapp微信小程序 选择聊天记录文件上传

    uniapp微信小程序 选择聊天记录文件上传

    目录 精简版总结 示例 容易踩的坑 1、页面刷新问题 2、extension问题 单文件 多个文件 PS:files和filePath/name只能二选一组 此处用xlsx文件作实例,选择聊天记录中的xlsx文件上传到指定接口中。 因为某些微信版本extension可能不生效,或者又想要对提交的文件名做校验,建议参考我

    2024年02月09日
    浏览(174)
  • 微信小程序uniapp中的图片上传,压缩,预览,删除

    页面部分 1:图片上传 2:图片压缩 3:图片预览 4:图片删除

    2024年02月11日
    浏览(43)
  • 微信小程序:uniapp解决上传小程序体积过大的问题

    微信小程序:uniapp解决上传小程序体积过大的问题

    在昨天的工作中遇到了一个微信小程序上传代码过大的情况,在这里总结一下具体的解决步骤,首先介绍一下,技术栈是使用uniapp框架+HBuilderX的开发环境。 错误提示 真机调试,提示包提交过大,不能正常生成二维码,后续上传代码更是不可能了,减少包中的体积顺着这条思

    2024年02月03日
    浏览(37)
  • 微信小程序上传文件(图片)至阿里云OSS,包含后端代码示例。

    微信小程序上传文件(图片)至阿里云OSS,包含后端代码示例。

    ps:本文较为详细,需要有耐心的阅读,要是图片看不清楚可以下载到本地放大查看。 写这篇博客的主要目的是因为serverless架构下直接上传图片只能转base64,且body大小有限制 一、在阿里云创建RAM用户与角色 1.为什么要使用RAM用户? 云账号 AccessKey 是您访问阿里云 API 的密钥,具

    2024年02月04日
    浏览(11)
  • 微信小程序使用阿里云oss设置上传文件的content-type

    图片文件上传到阿里云oss的默认访问content-type是jpge,这个格式在浏览器不能直接打开,需要手动设置上传的content-type 参考链接 UploadTask wx.uploadFile(Object object) OSS调用PostObject用于通过HTML表单上传的方式将文件(Object)上传到指定存储空间(Bucket)。 阿里OSS 上传图片 springboo

    2024年02月12日
    浏览(18)
  • 微信小程序---图片裁剪、旋转、预览、上传功能实现(已经封装成组件,需要的到资源下载)

    微信小程序---图片裁剪、旋转、预览、上传功能实现(已经封装成组件,需要的到资源下载)

    1、可以拍摄或选择本地图片上传图片数据 2、图片上传数据可以进行裁剪、选择、取消、裁剪后预览、上传以及限制大小,还可以缩放操作,需要的可以解除限制即可 1、点击图片上传按钮时,跳转页面到cropper进行图片选择剪切 wx.navigateTo({       url: `/pages/cropper/cropper?d

    2023年04月26日
    浏览(37)
  • uniApp移动端-H5-微信小程序上传文件(图片,文档和视频等)

    封装了一个插件可直接使用: 插件地址:uniApp移动端-H5-小程序上传文件(图片,文档和视频等),插件可直接用Hbuilderx导入示例项目查看, 实现方法: H5内部是使用uni-app官方内部方法uni.chooseFile 小程序端因hybrid不能使用本地HTML,所以插件提供的是uni-app官方内部方法wx.cho

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包