aliyun-oss存储遇到的坑

对象存储服务(Object Storage Service,简称 OSS)提供基于网络的数据存取服务。使用 OSS,可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。

对象存储可以简单理解为用来存储图片、音频、视频等非结构化数据的数据池。相对于主机服务器,具有读写速度快,利于分享的特点。

官网给出例子如下:

const axios = require("axios");
const OSS = require("ali-oss");

// 在客户端使用临时访问凭证初始化OSS客户端,用于临时授权访问OSS资源。
const getToken = async () => {
  // 设置客户端请求访问凭证的地址。
  await axios.get("http://localhost:8000/sts").then((token) => {
    const client = new OSS({
       // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
      region: 'oss-cn-hangzhou',
      accessKeyId: token.data.AccessKeyId,
      accessKeySecret: token.data.AccessKeySecret,
      stsToken: token.data.SecurityToken,
      // 填写Bucket名称。
      bucket: "examplebucket",
      // 刷新临时访问凭证。
      refreshSTSToken: async () => {
        const refreshToken = await axios.get("http://localhost:8000/sts");
        return {
          accessKeyId: refreshToken.AccessKeyId,
          accessKeySecret: refreshToken.AccessKeySecret,
          stsToken: refreshToken.SecurityToken,
        };
      },
    });
    // 使用临时访问凭证上传文件。
    // 填写不包含Bucket名称在内的Object的完整路径,例如exampleobject.jpg。
    // 填写本地文件的完整路径,例如D:\example.jpg。
    client.put('exampleobject.jpg', 'D:\example.jpg').then((res)=>{console.log(res)}).catch(e=>console.log(e))
  });
};
getToken()

我的使用场景说明:原生HTML中使用,通过script引入sdk: <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>

问题1:client.put(…).then is not a function

解决方案:将new OSS更改为new OSS.Wrapper

function getToken(e, id) {
    const client = new OSS.Wrapper({
        region: uploadInfo.region,
        accessKeyId: uploadInfo.keyId,
        accessKeySecret: uploadInfo.keySecret,
        stsToken: uploadInfo.stsToken,
        bucket: uploadInfo.bucket,
        // secure: true,
        endpoint: '',
    });

问题2:Must provide String/Buffer/ReadableStream for put.

解决方法:将client.put更改为client.multipartUpload

    client.multipartUpload(path, e)
        .then((ossRes) => {
            if (ossRes && ossRes.name) {
                const url = `https://${client.options.bucket}.${client.options.endpoint.host}/${ossRes.name}`;
                submitParams.imageObj[id] = {
                    path: url.split('.com/')[1]
                }
            }
        }).catch(e => console.log('图片getToken失败', e))

最终

function getToken(e, id) {
    const client = new OSS.Wrapper({
        region: uploadInfo.region,//uploadInfo是后端返回的
        accessKeyId: uploadInfo.keyId,
        accessKeySecret: uploadInfo.keySecret,
        stsToken: uploadInfo.stsToken,
        bucket: uploadInfo.bucket,
        endpoint: '固定的一个值',
    });
    const path = `${uploadInfo.pathPrefix}/你的路由`
    client.multipartUpload(path, e)
        .then((ossRes) => {
            if (ossRes && ossRes.name) {
                // dosomething
            }
        }).catch(e => console.log('图片getToken失败', e))
}

原文链接:https://juejin.cn/post/7213537146362167355 作者:let_code

(1)
上一篇 2023年3月23日 上午11:21
下一篇 2023年3月23日 上午11:31

相关推荐

发表评论

登录后才能评论