业务场景
最近接到一个业务,客户要求开发一个图片文件上传到阿里云OSS的模块。目前项目使用的是nodejs语言,现在的情况是将图片存在本地服务器,并返回一个图片链接。接到任务之后,去阿里云读了一下文档,又在社区看了几个案例,在尝试了两种办法之后,终于搞定了,下面分享一下我的经验。
安装依赖
npm install ali-oss
npm install fs
实战案例
//引入必要依赖
const fs = require('fs')
const OSS = require('ali-oss')
//初始化阿里云oss
const client = new OSS({
// 以华南3(广州)为例,region填写为oss-cn-guangzhou。
region: 'yourregion',
// 填写AK和AS
accessKeyId:'<youraccessKeyId>',
accessKeySecret:'<youraccessKeySecret>',
// 填写待配置跨域资源共享规则的Bucket名称。
bucket: '<yourbucket>'
})
async uploadAction(ctx) {
const form = ctx.request.body
const file = ctx.request.files.file; // 获取上传文件
let stream = fs.createReadStream(file.path);
let size = fs.statSync(file.path).size;
let pat = guid() + file.name.substring(file.name.lastIndexOf('.'), file.name.length)//生成随机文件名
let cloudPath = `/${form.path}/+${pat}`//拼接阿里云的云端路径,注意一定现在阿里云建好对应的文件夹
let result = await client.putStream(
cloudPath , stream, {contentLength: size}
)
console.log(result,'result')
//将上传日志写入数据库,根据业务场景,也可以不做这一步
let log = await model.add({
filename: file.name,
size: file.size,
realname: pat,
type: file.type,
})
let returnData = {
code: 1,
data: {
insertId: log.insertId,
url: result.url
}
}
//将阿里云oss的图片链接返回前端
return returnData;
}
到这一步之后,我惊奇的发现阿里云oss并没有储存我上传的图片,这是为什么呢? 权限问题! 阿里云默认对资源是只读权限,于是我更改了阿里云oss的公共读写权限,这次终于返回了阿里云的图片链接!