阿里OSS默认并不支持文件夹的上传,只允许单个文件的上传。如果有上传文件夹的需求,有两种方法:1、可以遍历文件夹,逐个上传文件。2、压缩文件后上传。
需要用到的npm包
首先新建一个uploadOSS.js文件,代码如下。
OSS提供的上传方法
const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8"));
const remotePath = `/ossDir/${packageJSON.version}/`;
const localPath = "./localhostDir/";
const client = new OSS({
endpoint: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
accessKeyId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
accessKeySecret: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
bucket: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
});
async function uploadDir(file) {
try {
// 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
// file的path默认是反斜杠,需要转为正斜杠。
const formatFile = path.normalize(file).replace(/\\/g, "/");
const remotePaths = remotePath + formatFile;
const result = await client.put(remotePaths, formatFile);
if (result.res.status === 200) {
console.log("UPLOAD SUCCESS:" + formatFile);
}
} catch (e) {
console.log(e);
}
}
async function upload(file, uploadedName) {
try {
// 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
// file的path默认是反斜杠,需要转为正斜杠。
const formatFile = path.normalize(file).replace(/\\/g, "/");
const remotePaths = remotePath + uploadedName;
const result = await client.put(remotePaths, formatFile);
if (result.res.status === 200) {
console.log("UPLOAD SUCCESS:" + formatFile);
}
} catch (e) {
console.log(e);
}
}
上传前清空文件夹
async function deleteAll () {
const result = await client.list({
prefix: remotePath
});
result.objects.forEach(item => {
console.log("DELETE SUCCESS:" + item.name);
client.delete(item.name);
});
}
上传文件夹
function readDir(currentDirPath, callback) {
fs.readdir(currentDirPath, function (err, files) {
if (err) {
throw new Error(err);
}
files.forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
readDir(filePath, callback);
}
});
});
}
readDir(localPath, function (filePath, stat) {
uploadDir(filePath);
});
压缩文件后再上传
async function compressFolderAndUpload(path) {
const fileName = `v${packageJSON.version}.tar`;
const toPath = `./compress/${fileName}`;
await compressing.tar.compressDir(path, toPath);
upload(toPath, fileName);
}
compressFolderAndUpload(localPath);