使用nodejs上传文件到阿里云oss的案例

1,266 阅读1分钟

业务场景

最近接到一个业务,客户要求开发一个图片文件上传到阿里云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的公共读写权限,这次终于返回了阿里云的图片链接!