【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
    评论
要把静态文件里的图片路径保存到 MySQL 数据库中,可以先将图片服务器上的某个目录下,然后把该图片的路径保存到数据库中。 具体实现步骤如下: 1. 在 egg 中配置静态资源目录,例如: ``` // config/config.default.js exports.static = { prefix: '/public/', dir: path.join(appInfo.baseDir, 'app/public') }; ``` 2. 在前端页面中上图片并将其保存到服务器上的某个目录下,例如: ``` <input type="file" id="upload-file" name="upload-file"> <script> var input = document.getElementById('upload-file'); var file = input.files[0]; var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(formData); </script> ``` 3. 在 egg 中编写上图片的路由处理函数,并将图片路径保存到 MySQL 数据库中,例如: ``` // app/controller/upload.js const fs = require('fs'); const path = require('path'); const Controller = require('egg').Controller; class UploadController extends Controller { async index() { const { ctx } = this; const file = ctx.request.files[0]; const filename = file.filename; const targetPath = path.join(this.config.static.dir, filename); const result = await new Promise((resolve, reject) => { const stream = fs.createWriteStream(targetPath); stream.on('finish', () => { resolve({ code: 0, msg: '上成功', data: { url: `${this.config.static.prefix}${filename}` } }); }); stream.on('error', (err) => { reject({ code: -1, msg: '上失败', data: err }); }); file.stream.pipe(stream); }); if (result.code === 0) { const url = result.data.url; const { affectedRows } = await ctx.app.mysql.insert('images', { url }); if (affectedRows === 1) { ctx.body = { code: 0, msg: '保存成功', data: url }; } else { ctx.body = { code: -1, msg: '保存失败', data: null }; } } else { ctx.body = result; } } } module.exports = UploadController; ``` 在该路由处理函数中,首先将上图片保存到服务器上的某个目录下,然后将图片的路径保存到 MySQL 数据库中,并返回图片的访问路径给前端页面。 注意:在实际开发中,需要对上文件进行安全性检查,例如文件类型、大小等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值