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