Egg 实现上传文件到本地服务器
要理解当前代码,需要了解node.js 的 stream 工作原理,后续博客再分享~
这里以base64转换为file文件类型的上传头像为例子
// 上传头像
async uploadAvatar() {
const { ctx } = this;
const stream = await ctx.getFileStream(); // 获取文件流
}
console.log(stream) 👇
const filename = Math.random().toString(36).substr(2) + new Date().getTime() + path.extname(stream.filename).toLocaleLowerCase();
- console.log(Math.random().toString(36).substr(2) + new Date().getTime()) 👇 获取一个随机名称 + 当前时间的时间戳 组成新的文件名
- console.log(path.extname(stream.filename).toLocaleLowerCase()) //获取文件扩展名,确保转化为小写
path.extname用法 可以点击博客 👈
const target = path.join(this.config.baseDir, this.config.avatar, filename);
路径拼接
const writeStream = fs.createWriteStream(target); // 创建写入流--对文件流进行写入--第一个参数为路径,要自定义!!
在这里时,先安装 👇 两个插件
引入插件
let avatar = '';
try {
// 异步把文件流 写入
await awaitWriteStream(stream.pipe(writeStream));
avatar = "http://" + this.app.config.cluster.listen.hostname + ':' + this.app.config.cluster.listen.port + this.config.static.prefix + 'images/avatar/' + filename;
} catch (err) {
// 如果出现错误,则关闭管道
await sendToWormhole(stream);
ctx.status = 500;
ctx.body = {
msg: '未知错误!'
}
throw err;
}
ctx.status = 201;
ctx.body = {
msg: '上传成功!',
avatar
}
console.log(this.config.static.prefix)
console.log(avatar) 👇
了解下管道流
实现效果
完整代码如下
// 上传头像
async uploadAvatar() {
const { ctx } = this;
const stream = await ctx.getFileStream(); // 获取文件流
const filename = Math.random().toString(36).substr(2) + new Date().getTime() + path.extname(stream.filename).toLocaleLowerCase();
const target = path.join(this.config.baseDir, this.config.avatar, filename);
const writeStream = fs.createWriteStream(target); // 创建写入流--对文件流进行写入--第一个参数为路径,要自定义!!
let avatar = '';
try {
// 异步把文件流 写入
await awaitWriteStream(stream.pipe(writeStream));
avatar = "http://" + this.app.config.cluster.listen.hostname + ':' + this.app.config.cluster.listen.port + this.config.static.prefix + 'images/avatar/' + filename;
console.log(this.config.static.prefix)
console.log(avatar)
} catch (err) {
// 如果出现错误,则关闭管道
await sendToWormhole(stream);
ctx.status = 500;
ctx.body = {
msg: '未知错误!'
}
throw err;
}
ctx.status = 201;
ctx.body = {
msg: '上传成功!',
avatar
}
}