This plugin integrates Tencent Cloud Object Storage (COS) with the Egg.js framework, a Node.js framework developed by Alibaba Group. It supports two methods for file uploads:
- file mode:its better for small file is temporarily stored on the server during processing;
- stream mode: for large files, server friendly;
Initially, I attempted to contribute the stream mode functionality to another project, but did not receive a response from the owner. Therefore, I decided to release this plugin to the community.
npm install @onewalker/egg-cos
// {app_root}/config/plugin.js
exports.cos = {
enable: true,
package: '@onewalker/egg-cos'
};
// {app_root}/config/config.default.js
exports.cos = {
client: {
SecretId: '',
SecretKey: '',
Bucket: '',
Region: ''
}
};
Init in egg agent, default is false
:
exports.cos = {
useAgent: true
};
You can aquire tencent cloud cos instance on app
or ctx
.
// upload a file in controller
- File Mode:The file is temporarily stored as cache in your server during the process;
const path = require('path');
const Controller = require('egg').Controller;
module.exports = class extends Controller {
async upload() {
const ctx = this.ctx;
// please enable `file` mode of `egg-multipart`.
const file = ctx.request.files[0];
const name = 'egg-cos/' + path.basename(file.filename);
let result;
try {
result = await ctx.cos.put(name, file.filepath);
} finally {
// need to remove the tmp files
await ctx.cleanupRequestFiles();
}
if (result) {
ctx.logger.info('cos response:\n', result);
ctx.body = {
url: `https://${result.Location}`
};
} else {
ctx.body = 'please select a file to upload!';
}
}
};
- upload by Stream:The file is transfered to cloud server directly, not go through your server;
const Controller = require('egg').Controller;
const sendToWormhole = require('stream-wormhole');
async upload() {
const ctx = this.ctx;
const parts = ctx.multipart();
let part,results=[];
while ((part = await parts()) != null) {
if (part.length) {
// This is content of part stream
console.log('field: ' + part[0]);
console.log('value: ' + part[1]);
console.log('valueTruncated: ' + part[2]);
console.log('fieldnameTruncated: ' + part[3]);
} else {
if (!part.filename) {
return;
}
console.log('field: ' + part.fieldname);
console.log('filename: ' + part.filename);
console.log('encoding: ' + part.encoding);
console.log('mime: ' + part.mime);
console.log("part",part.stream,typeof part);
// file processing, uploading the file to Tencent Cloud Server
let result;
let path=await ctx.helper.MD5encode(String(Date.now()));
let typeArray=part.mime.split('/');
let type=typeArray[typeArray.length-1];
let name='ysxbdms/projects/'+path+`.${type}`;//the upload links
try {
result = await ctx.cos.putStream(name,part);
} catch (err) {
await sendToWormhole(part);
throw err;
}
console.log(result);
results.push(result);
}
}
console.log('and we are done parsing the form!');
ctx.body=results;
};
Please open an issue here.