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)
请求:


浙公网安备 33010602011771号