[从入门到入土(后端篇)]三,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名称,
直接上图片解释一下,应该就清楚了
我使用的获取文件资源路径的方法,采用了字符串切割拼装的方法。。。如果有其他的更好的方法,欢迎一起讨论
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);
}
}
在这个博客中我就使用了这两种方法,其他的方法,如果各位有需要可以看官方文档。阿里的文档还是可以的。
- 后端demo地址:blogServerDemo