eggjs上传文件,并md5名称保存

安装插件:

npm i md5 --save

npm i egg-multipart --save

npm i stream-to-array --save

npm i stream-wormhole --save

 

// 本地保存

主要代码:  // upload.js

'use strict';
const md5 = require('md5')
const path = require("path")
const fs = require("fs")
const toArray = require('stream-to-array');
const sendToWormhole = require('stream-wormhole');

const Controller = require('egg').Controller;
const settings = require('../../config/settings');

class UploadController extends Controller {

  async post() {
    const { ctx } = this;
    let dir_name = ctx.params.dir_name
    const stream = await ctx.getFileStream();
    let url = ""
    try {
      const parts = await toArray(stream);
      let data = Buffer.concat(parts);
      let file_md5 = md5(data)
      let file_name = `${file_md5}${path.extname(stream.filename)}`
      let file_path = path.join(this.config.baseDir, "app/public", dir_name, file_name)

      // 保存文件
      // console.log(file_path)
      await fs.writeFile(file_path, data, (err) => { });
      url = `http://${settings.addr}:${settings.port}/static/${dir_name}/${file_name}`

    } catch (err) {
      await sendToWormhole(stream);
    }
    
    ctx.body = {
      url: url
    };
    
  }
}

module.exports = UploadController;

路由:

 配置: // mode: stream

 使用:

 

参考官方文档:  // 有写法例子,在他的基础上加了md5而已

https://github.com/eggjs/egg-multipart

https://github.com/eggjs/examples/blob/master/multipart/app/controller/buffer.js

 

// 上传至阿里oss

app/controller/upload.js

'use strict';
const md5 = require('md5')
const path = require("path")
const fs = require("fs")
const toArray = require('stream-to-array');
const sendToWormhole = require('stream-wormhole');
const Controller = require('egg').Controller;

const OSS = require('ali-oss');
const client = new OSS({
  region: "oss-cn-shanghai",
  accessKeyId: "*****",
  accessKeySecret: "******",
  bucket: "*****",
  secure: true,
  timeout: 5000,
})

class UploadController extends Controller {

  async post_oss() {
    const { ctx } = this;
    let dir = decodeURI(ctx.query.dir)
    const stream = await ctx.getFileStream();
    let res 
    try {
      const parts = await toArray(stream);
      let data = Buffer.concat(parts);
      let file_md5 = md5(data)
      let file_name = `${dir}${file_md5}${path.extname(stream.filename)}`
      // 上传至oss
      let result = await client.put(file_name, data)
      // console.log(result)
      res = {
        status: 0,
        url: result.url,
        message: '上传成功!'
      }
    } catch (err) {
      console.log('上传失败:', err)
      await sendToWormhole(stream);
      res = {
        status: 1,
        url: "",
        message: '上传失败!'
      }
      // 修改响应状态码
      ctx.response.status = 500
    }
    
    ctx.body = res
  }
}

module.exports = UploadController;

router.js

router.post('/api/v1/upload/oss/', controller.upload.post_oss)

请求:

 

posted @ 2021-05-08 11:00  zezhou222  阅读(628)  评论(0)    收藏  举报