首先我想要的是一个脚本可以上传图片
需求是有一个文件夹,图片文件不详
结合官方API,https://help.aliyun.com/document_detail/111265.html
nodejs代码如下:
//获取项目工程里的图片
var fs = require('fs');//引用文件系统模块
var image = require("imageinfo"); //引用imageinfo模块
const OSS = require('ali-oss')
const path = require("path")
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'oss-cn-beijing',
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
accessKeyId: '--',
accessKeySecret: '--',
// 填写Bucket名称。
bucket: '--',
});
async function put (filename) {
try {
// 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
// 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
const result = await client.put(filename, path.normalize('/data/ueditor-node/example/public/img/ueditor/'+filename), {
headers: {
'Content-Type': 'image/jpg'
}
});
console.log(result);
} catch (e) {
console.log(e);
}
}
function readFileList(path, filesList) {
var files = fs.readdirSync(path);
files.forEach(function (itm, index) {
var stat = fs.statSync(path + itm);
if (stat.isDirectory()) {
//递归读取文件
readFileList(path + itm + "/", filesList)
} else {
var obj = {};//定义一个对象存放文件的路径和名字
obj.path = path;//路径
obj.filename = itm//名字
filesList.push(obj);
}
})
}
var getFiles = {
//获取文件夹下的所有文件
getFileList: function (path) {
var filesList = [];
readFileList(path, filesList);
return filesList;
},
//获取文件夹下的所有图片
getImageFiles: function (path) {
var imageList = [];
this.getFileList(path).forEach((item) => {
var ms = image(fs.readFileSync(item.path + item.filename));
ms.mimeType && (imageList.push(item.filename))
});
return imageList;
}
};
//获取文件夹下的所有文件
getFiles.getFileList("./public/img/ueditor/").forEach((e)=>{
put(e.filename)
});
思路就是先获取指定文件夹下的所有图片名称,然后遍历读取,之后上传,
然后问题出现了
大概跟这个问题是一样的
https://github.com/ali-sdk/ali-oss/issues/107
最后发现了 ossutil支持通过Windows、Linux和macOS系统以命令行方式管理OSS数据。
完美解决。