Skip to content

Latest commit

 

History

History
159 lines (130 loc) · 4.5 KB

README.md

File metadata and controls

159 lines (130 loc) · 4.5 KB

egg-cos

简体中文

腾讯云cos存储在Egg.js框架插件 -Tencent COS(Cloud Object Storage) Egg.js Plugin

NPM version Test coverage Known Vulnerabilities npm download

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.

Install

  npm install @onewalker/egg-cos

Configuration

// {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
};

Usage

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;
};

Questions & Suggestions

Please open an issue here.

License

MIT