| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- /*
- * This file is part of HexoEditor.
- *
- * Copyright (c) 2018 zhuzhuyule
- */
- var cosServer = (function () {
- let log = log4js.getLogger('hexo-cos.js');
- let fs = require('fs');
- let path = require('path');
- let config = {
- SecretId: '',
- SecretKey: '',
- Bucket: '',
- Region: '',
- Protocol: 'http://',
- Customize: ''
- };
- let TaskId;
- class CosServer {
- constructor(acessKey, secretKey) {
- acessKey = acessKey || moeApp.config.get('image-cos-accessKey');
- secretKey = secretKey || moeApp.config.get('image-cos-secretKey');
- config.SecretId = acessKey;
- config.SecretKey = secretKey;
- this.cos = new (require('cos-nodejs-sdk-v5'))({
- // 必选参数
- SecretId: acessKey,
- SecretKey: secretKey,
- // 可选参数
- FileParallelLimit: 5, // 控制文件上传并发数
- ChunkParallelLimit: 5, // 控制单个文件下分片上传并发数
- ChunkSize: 2 * 1024 * 1024, // 控制分片大小,单位 B
- });
- }
- /**
- * 更新信息
- * @param acessKey
- * @param secretKey
- * @param bucket
- * @param region
- */
- update(acessKey, secretKey, bucket, region, protocol,customize) {
- this.cos.options.SecretId = acessKey || config.SecretId || '';
- this.cos.options.SecretKey = secretKey || config.SecretKey || '';
- config.SecretId = acessKey || config.SecretId || '';
- config.SecretKey = secretKey || config.SecretKey || '';
- config.Bucket = bucket || config.Bucket || '';
- config.Region = region || config.Region || '';
- config.Protocol = protocol || config.Protocol || 'http://';
- config.Customize = customize || '';
- log.debug('update options.')
- }
- getService(cb) {
- this.cos.getService(function (err, data) {
- if (!err && !err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- getFileURL(key, cb) {
- let url = this.cos.getObjectUrl({
- Bucket: config.Bucket, // Bucket 格式:test-1250000000
- Region: config.Region,
- Key: key,
- Expires: 60,
- Sign: true,
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- return url;
- }
- getBucketLocation(cb) {
- this.cos.getBucketLocation({
- Bucket: config.Bucket, // Bucket 格式:test-1250000000
- Region: config.Region
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- getBucketVersioning(cb) {
- this.cos.getBucketVersioning({
- Bucket: config.Bucket, // Bucket 格式:test-1250000000
- Region: config.Region
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- putObjectCopy(filename, cb) {
- this.cos.putObjectCopy({
- Bucket: config.Bucket, // Bucket 格式:test-1250000000
- Region: config.Region,
- Key: filename,
- CopySource: config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + filename
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- download(serverFile, localFile, cb) {
- let localName = localFile + path.basename(serverFile);
- this.cos.getObject({
- Bucket: config.Bucket, // Bucket 格式:test-1250000000
- Region: config.Region,
- Key: serverFile,
- Output: localName,
- onProgress: function (progressData) {
- // console.log(JSON.stringify(progressData));
- }
- }, function (err, data) {
- if (typeof cb === 'function')
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- deleteObject(fileanme, cb) {
- this.cos.deleteObject({
- Bucket: config.Bucket,
- Region: config.Region,
- Key: fileanme
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(`[${fileanme}]: was deleted!`)
- data.statusCode = 200;
- } else {
- log.error(`[${fileanme}]:` + err.error.message)
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- deleteMultipleObject(fileanmes, cb) {
- this.cos.deleteMultipleObject({
- Bucket: config.Bucket,
- Region: config.Region,
- Objects: fileanmes // [
- // {Key: '1mb.zip'},
- // {Key: '3mb.zip'},
- // ]
- }, function (err, data) {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(data)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- if (typeof cb === 'function')
- cb(err || data);
- });
- }
- uploadFile(localFile, serverFile, cb) {
- if (!serverFile)
- serverFile = path.basename(localFile);
- this.cos.putObject({
- Bucket: config.Bucket, /* 必须 */ // Bucket 格式:test-1250000000
- Region: config.Region,
- Key: serverFile, /* 必须 */
- TaskReady: function (tid) {
- TaskId = tid;
- },
- onProgress: function (progressData) {
- // console.log(JSON.stringify(progressData));
- },
- // 格式1. 传入文件内容
- // Body: fs.readFileSync(filepath),
- // 格式2. 传入文件流,必须需要传文件大小
- Body: fs.createReadStream(localFile),
- ContentLength: fs.statSync(localFile).size
- }, function (err, data) {
- /*data = {
- * ETag: "b2b35ae16725f9578f58ebe98f53bb4d",
- * Location: "http://myblog-1256010832.cos.ap-chengdu.myqcloud.com/test.png",
- * statusCode: 200,
- * headers: {}
- }*/
- if (typeof cb === "function") {
- let result = {type: 100, id: localFile};
- if (err) {
- result.type = 100;
- result.statusCode = err.statusCode;
- result.msg = err.error.message;
- } else {
- let url = config.Protocol + data.Location.replace(/https?:\/\//, '');
- if(config.Customize)
- url = url.replace(/^https?:\/\/[^\/]+/,config.Customize.replace(/\/$/,''));
- result.type = 200;
- result.statusCode = data.statusCode;
- result.data = {
- localname: path.basename(localFile),
- storename: path.basename(serverFile),
- path: serverFile,
- url: url
- }
- }
- cb(result)
- } else {
- if (err) {
- log.error(err.error.message);
- } else {
- log.info(config.Protocol + data.Location.replace(/https?:\/\//, ''))
- }
- }
- });
- }
- sliceUploadFile(localFile, serverFile, cb) {
- if (!serverFile)
- serverFile = path.basename(localFile);
- this.cos.sliceUploadFile({
- Bucket: config.Bucket, /* 必须 */ // Bucket 格式:test-1250000000
- Region: config.Region,
- Key: serverFile, /* 必须 */
- FilePath: localFile, /* 必须 */
- TaskReady: function (tid) {
- TaskId = tid;
- },
- onHashProgress: function (progressData) {
- // console.log(JSON.stringify(progressData));
- },
- onProgress: function (progressData) {
- // console.log(JSON.stringify(progressData));
- },
- }, function (err, data) {
- /*data = {
- * Bucket: "myblog",
- * ETag: "",
- * Key: "test.png",
- * Location: "url",
- * statusCode: 200,
- * headers: {}
- }*/
- if (typeof cb === "function") {
- let result = {type: 100, id: localFile};
- if (err) {
- result.statusCode = err.statusCode;
- result.msg = err.error.message;
- } else {
- let url = config.Protocol + data.Location.replace(/https?:\/\//, '');
- if(config.Customize)
- url = url.replace(/^https?:\/\/[^\/]+/,config.Customize.replace(/\/$/,''));
- result.type = 200;
- result.statusCode = data.statusCode;
- result.data = {
- localname: path.basename(localFile),
- storename: path.basename(serverFile),
- path: data.Key,
- url: url
- }
- }
- cb(result)
- } else {
- if (!err && [200, 204].includes(data.statusCode)) {
- log.info(config.Protocol + data.Location)
- data.statusCode = 200;
- } else {
- log.error(err.error.message);
- }
- }
- });
- }
- cancelTask() {
- this.cos.cancelTask(TaskId);
- console.log('canceled');
- }
- pauseTask() {
- this.cos.pauseTask(TaskId);
- console.log('paused');
- }
- restartTask() {
- this.cos.restartTask(TaskId);
- console.log('restart');
- }
- }
- return CosServer;
- })();
- module.exports = cosServer;
|