UNPKG

ghost-storage-cos

Version:

This Ghost custom storage module allows you to store media file with Tencent Cloud Cos instead of storing at local machine.

131 lines (116 loc) 3.14 kB
/** * Created by ChengZheLin on 2019/5/10. * Features: */ 'use strict' const COS = require('cos-nodejs-sdk-v5') const debug = require('ghost-ignition').debug('ghost-storage-cos') const BaseAdapter = require('ghost-storage-base') const RE = /(.*)(?=\/ghost\/content)/ class QCloudCustomAdapter extends BaseAdapter { constructor(config) { super() this.baseParams = { Bucket: config.Bucket, Region: config.Region } this.baseUrl = config.baseUrl this.cos = new COS({ SecretId: config.SecretId, SecretKey: config.SecretKey }) } exists(fileName, targetDir) { const filePath = path.join(targetDir || this.storagePath, fileName) const Key = filePath.replace(RE, '') return new Promise((resolve, reject) => { this.cos.headObject({ ...this.baseParams, Key }, (err, data) => { if (err) { debug("error", err) console.log(JSON.stringify(err)) err.statusCode ? resolve(false) : reject(err) } else { data.statusCode === 200 ? resolve(true) : resolve(false) } }) }) } save(file) { return new Promise((resolve, reject) => { this.cos.sliceUploadFile({ ...this.baseParams, Key: this.generatePushKey(file), FilePath: file.path }, (err, data) => { if (err) { debug("error", err) console.log(JSON.stringify(err)) reject(err) } else { let url = this.baseUrl ? data.Location.replace(/.*\.com\//, this.baseUrl) : '//' + data.Location resolve(url) } }) }) } generatePushKey(file) { const date = new Date() let YY = date.getFullYear() let MM = date.getMonth() + 1 if (MM <= 9) { MM = '0' + MM } // return `/ghost/content/images/${YY}/${MM}/${file.name.replace(/[^\x00-\xff]/g, '')}` return `/ghost/content/images/${YY}/${MM}/${file.filename.substring(0, 16)}${file.ext}` } serve() { return function customServe(req, res, next) { next() } } delete() { return Promise.reject('not implemented') /*return new Promise((resolve, reject) => { this.cos.deleteObject({ ...this.bsseParams, key }, function (err, data) { if (err) { reject(err) } else { (data.statusCode < 300 && data.statusCode >= 200) ? resolve(true) : resolve(false) } }) })*/ } read(options) { const Key = options.path.replace(RE, '') return new Promise((resolve, reject) => { this.cos.getObject({ ...this.baseParams, Key }, (err, data) => { debug("error", err) console.log(JSON.stringify(err)) if (err || data.error) { return reject(new Error(` Could not read image \n ${Key} error: ${JSON.stringify(err)} response: ${JSON.stringify(data)} `)) } resolve(data.Body) }) }) } } module.exports = QCloudCustomAdapter