单文件上传

优质
小牛编辑
137浏览
2023-12-01

egg 单文件上传

  • [ ] 通过ctx.getFileStream便捷的获取到用户上传的文件,需要满足两个条件:
  • 只支持上传一个文件。
  • 上传文件必须在所有其他的 fields 后面,否则在拿到文件流时可能还获取不到 fields。

    文档:https://eggjs.org/zh-cn/basics/controller.html 代码:

    
    'use strict';

const Controller = require('egg').Controller;

const path = require('path') const fs = require('fs') const sendToWormhole = require('stream-wormhole');

class UserController extends Controller {

/**
 * 上传用户头像
 */
async upload() {
    const { ctx } = this

    // 读取表单提交的文件流
    const stream = await ctx.getFileStream()

    // 获取上传的文件名  like.jpg dog.png 
    const file_name = path.basename(stream.filename)

    // 拼接上传路径
    const upload_path = 'app/public/admin/uploads/' + file_name

    // 创建一个可以写入的流
    const writeStream = fs.createWriteStream(upload_path)

    let result;
    try {
        // 把读取到的表单信息流写入创建的可写流
        result = await stream.pipe(writeStream)
    } catch (err) {
        // 上传失败销毁流
        await sendToWormhole(stream) 
        throw err
    }


    ctx.body = {
        url: upload_path, // 上传路径
        fields: stream.fields // 所有表单字段都能通过 `stream.fields` 获取到
    }
}

}

module.exports = UserController;

*****
### 使用 pump 插件上传
* [ ] 文档:https://www.npmjs.com/package/pump
* [ ] 首先安装  npm install pump
* [ ] 代码:

'use strict';

const Controller = require('egg').Controller;

const path = require('path') const fs = require('fs') const pump = require('pump')

class UserController extends Controller {

/**
 * 上传用户头像
 */
async upload() {
    const { ctx } = this

    // 读取表单提交的文件流
    const stream = await ctx.getFileStream()

    // 获取上传的文件名  like.jpg dog.png 
    const file_name = path.basename(stream.filename)

    // 拼接上传路径
    const upload_path = 'app/public/admin/uploads/' + file_name

    // 创建一个可以写入的流
    const writeStream = fs.createWriteStream(upload_path)

    // 第一个参数读取流,第二个参数可写流, 上传失败会自动销毁流
    await pump(stream, writeStream)


    ctx.body = {
        url: upload_path, // 上传路径
        fields: stream.fields // 所有表单字段都能通过 `stream.fields` 获取到
    }
}

}

module.exports = UserController;