egg 上传文件
发布于 2019-10-17 22:12:50
3080 次浏览
#route.js中添加一个路由规则
router.post('/upload',controller.upload.index);
在controller中新建upload文件
'use strict';
//node.js 文件操作对象
const fs = require('fs');
//node.js 路径操作对象
const path = require('path');
//egg.js Controller
const Controller = require('egg').Controller;
//故名思意 异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
//管道读入一个虫洞。
const sendToWormhole = require('stream-wormhole');
//当然你也可以不使用这个 哈哈 个人比较赖
//还有我们这里使用了egg-multipart
const md5 = require('md5');
class UploadController extends Controller {
async index() {
const ctx = this.ctx;
//egg-multipart 已经帮我们处理文件二进制对象
// node.js 和 php 的上传唯一的不同就是 ,php 是转移一个 临时文件
// node.js 和 其他语言(java c#) 一样操作文件流
const stream = await ctx.getFileStream();
//新建一个文件名
const filename = md5(stream.filename) + path
.extname(stream.filename)
.toLocaleLowerCase();
//文件生成绝对路径
//当然这里这样市不行的,因为你还要判断一下是否存在文件路径
const target = path.join(this.config.baseDir, 'app/public/uploads', filename);
//生成一个文件写入 文件流
const writeStream = fs.createWriteStream(target);
try {
//异步把文件流 写入
await awaitWriteStream(stream.pipe(writeStream));
} catch (err) {
//如果出现错误,关闭管道
await sendToWormhole(stream);
throw err;
}
//文件响应
ctx.body = {
url: '/public/uploads/' + filename
};
}
}
module.exports = UploadController;