picgo-plugin-s3-lls
Version:
picgo amazon s3 uploader
156 lines (155 loc) • 5.61 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const uploader_1 = __importDefault(require("./uploader"));
const utils_1 = require("./utils");
module.exports = (ctx) => {
const config = (ctx) => {
const defaultConfig = {
accessKeyID: '',
secretAccessKey: '',
bucketName: '',
// uploadPath: '{year}/{month}/{md5}.{extName}',
uploadPath: 'docs/{timestamp}.{extName}',
pathStyleAccess: true,
rejectUnauthorized: true,
acl: 'public-read'
};
let userConfig = ctx.getConfig('picBed.aws-s3');
userConfig = Object.assign(Object.assign({}, defaultConfig), (userConfig || {}));
return [
{
name: 'accessKeyID',
type: 'input',
default: userConfig.accessKeyID,
required: true,
message: 'access key id',
alias: '应用密钥 ID'
},
{
name: 'secretAccessKey',
type: 'password',
default: userConfig.secretAccessKey,
required: true,
message: 'secret access key',
alias: '应用密钥'
},
{
name: 'bucketName',
type: 'input',
default: userConfig.bucketName,
required: true,
alias: '桶'
},
{
name: 'uploadPath',
type: 'input',
default: userConfig.uploadPath,
required: true,
alias: '文件路径'
},
{
name: 'acl',
type: 'input',
default: userConfig.acl || 'public-read',
message: '文件访问权限',
required: true,
alias: '权限'
},
{
name: 'region',
type: 'input',
default: userConfig.region,
required: false,
alias: '地区'
},
{
name: 'endpoint',
type: 'input',
default: userConfig.endpoint,
required: false,
alias: '自定义节点'
},
{
name: 'urlPrefix',
type: 'input',
default: userConfig.urlPrefix,
message: 'https://img.example.com/bucket-name/',
required: false,
alias: '自定义域名'
},
{
name: 'pathStyleAccess',
type: 'confirm',
default: userConfig.pathStyleAccess || true,
message: 'enable path-style-access or not',
required: false,
alias: 'PathStyleAccess'
},
{
name: 'rejectUnauthorized',
type: 'confirm',
default: userConfig.rejectUnauthorized || true,
message: '是否拒绝无效TLS证书连接',
required: false,
alias: 'rejectUnauthorized'
},
// {
// name: 'acl',
// type: 'input',
// default: userConfig.acl || 'public-read',
// message: '上传资源的访问策略',
// required: false,
// alias: 'ACL 访问控制列表'
// }
];
};
const handle = async (ctx) => {
let userConfig = ctx.getConfig('picBed.aws-s3');
if (!userConfig) {
throw new Error("Can't find amazon s3 uploader config");
}
if (userConfig.urlPrefix) {
userConfig.urlPrefix = userConfig.urlPrefix.replace(/\/?$/, '');
}
const client = uploader_1.default.createS3Client(userConfig.accessKeyID, userConfig.secretAccessKey, userConfig.region, userConfig.endpoint, userConfig.pathStyleAccess, userConfig.rejectUnauthorized);
const output = ctx.output;
const tasks = output.map((item, idx) => uploader_1.default.createUploadTask(client, userConfig.bucketName, utils_1.formatPath(item, userConfig.uploadPath), item, idx, userConfig.acl));
try {
const results = await Promise.all(tasks);
for (let result of results) {
const { index, url, imgURL } = result;
delete output[index].buffer;
delete output[index].base64Image;
output[index].url = url;
output[index].imgUrl = url;
if (userConfig.urlPrefix) {
output[index].url = `${userConfig.urlPrefix}/${imgURL}`;
output[index].imgUrl = `${userConfig.urlPrefix}/${imgURL}`;
}
}
return ctx;
}
catch (err) {
ctx.log.error('上传到 Amazon S3 发生错误,请检查配置是否正确');
ctx.log.error(err);
ctx.emit('notification', {
title: 'Amazon S3 上传错误',
body: '请检查配置是否正确',
text: ''
});
throw err;
}
};
const register = () => {
ctx.helper.uploader.register('aws-s3', {
handle,
config,
name: 'Amazon S3'
});
};
return {
register
};
};