[从入门到入土(后端篇)]三,oss相关处理

[从入门到入土(后端篇)]三,oss相关处理

从入门到入土(前端篇)关于OSS处理文件上传文章中,已经讲解过怎么进行nodejs后端签名,前端直传,这里不多演示,直接上代码

1.后端签名,前端直传

我们在src/controller/ 文件夹中建立 oss/index.js (关于oss相关的操作,都在oss控制器中处理)

const crypto = require('crypto');

const ossConfig={
    OSSAccessKeyId: '',
    secret: '',
    host: '',
    expAfter: 300000, // 签名失效时间,毫秒
    maxSize: 1048576000, // 文件最大的 size
}


/**
 * 前端直传获取前端签名
 * @param ctx
 * @param next
 * @returns {Promise<void>}
 */
async function ossSign(ctx,next){
    const dirPath = 'demo/'; // bucket 项目里的文件路径
    const host = ossConfig.host;
    const expireTime = new Date().getTime() + ossConfig.expAfter;
    const expiration = new Date(expireTime).toISOString();
    const policyString = JSON.stringify({
        expiration,
        conditions: [
            [ 'content-length-range', 0, ossConfig.maxSize ],
        ],
    });
    const policy = Buffer.from(policyString).toString('base64');
    const signature = crypto.createHmac('sha1', ossConfig.secret).update(policy).digest('base64');
    ctx.body = {
        code:200,
        data:{
            signature,
            policy,
            host,
            OSSAccessKeyId: ossConfig.OSSAccessKeyId,
            key: expireTime,
            startsWith: dirPath,
        }
    }
}

module.exports={
    ossSign,
}

具体操作过程可以见前端流程

2.删除oss文件

我们可以根据官方文档进行操作

2.1 安装ali-oss
npm install ali-oss --save
2.2 配置oss对象
const OSS =require('ali-oss');

const client = new OSS({
    // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
    region: '',
    //  阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    accessKeyId: ossConfig.OSSAccessKeyId,
    accessKeySecret: ossConfig.secret,
    // 填写Bucket名称。
    bucket: '',
});
2.3 删除单个文件方法

文档中有一句注释:填写Object完整路径。Object完整路径中不能包含Bucket名称,
直接上图片解释一下,应该就清楚了
301.png

我使用的获取文件资源路径的方法,采用了字符串切割拼装的方法。。。如果有其他的更好的方法,欢迎一起讨论

async function deleteFile (ctx,next) {
    try {
        // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
        // let result = await client.delete('exampleobject.txt');
        let ossUrl = ctx.request.body.url;
        console.log("前端访问的地址:"+ossUrl);
        let spData = ossUrl.split("/");
        let delFile = "";
        for (let i =3;i< spData.length;i++){
            delFile +=spData[i]+"/"
        }
        delFile = delFile.substring(0,delFile.length-1);
        console.log("=====删除文件地址:"+delFile);
        // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
        let result = await client.delete(delFile);
        if(result.res.status == 204 ){
            ctx.body = ctx.body = {
                code:200,
                msg:"操作成功"
            }
        }else{
            ctx.body = ctx.body = {
                code:200,
                msg:JSON.stringify(result.res),
            }
        }
    } catch (e) {
      console.log(e);
    }
  }
2.4 删除多个文件

删除多个文件与单个文件一样,只是执行方法不同

/**
 * 删除多文件
 * @param ctx
 * @param next
 * @returns {Promise<void>}
 */
 async function ossDelMulti(ctx,next){
    try {
        // 填写需要删除的多个Object完整路径并设置返回模式为详细模式。Object完整路径中不能包含Bucket名称。
        //let result = await client.deleteMulti(['exampleobject-1', 'exampleobject-2', 'testfolder/sampleobject.txt']);
        //console.log(result);
        // 填写需要删除的多个Object完整路径并设置返回模式为简单模式。Object完整路径中不能包含Bucket名称。
        let delFileList = ctx.request.body.delFileList;
        for (let i = 0 ; i< delFileList.length;i++){
            let spData = delFileList[i].split("/");
            let delFile = "";
            for (let i =3;i< spData.length;i++){
                delFile +=spData[i]+"/"
            }
            delFileList[i] = delFile.substring(0,delFile.length-1);
        }
        let result = await client.deleteMulti(delFileList, {quiet: true});
        if(result.res.status == 204 ){
            ctx.body = ctx.body = {
                code:200,
                msg:"操作成功"
            }
        }else{
            ctx.body = ctx.body = {
                code:200,
                msg:JSON.stringify(result.res),
            }
        }
    } catch (e) {
        console.log(e);
        ctx.body = resUtils.resBody(resUtils.resCode.doError);
    }
}
在这个博客中我就使用了这两种方法,其他的方法,如果各位有需要可以看官方文档。阿里的文档还是可以的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值