【Egg】实现上传头像到本地服务器(单独一个图片文件)

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
    }
}
参考下面博客

egg框架中实现上传文件

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值