多文件上传

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

egg 多文件上传

>[danger] 如果要获取同时上传的多个文件,不能通过ctx.getFileStream()来获取 > 需要通过 ctx.multipart({ autoFields:true }) 获取 > autoFields: true 表示获取除了文件字段以外的其他信息字段

用户可以通过在config/config.default.js中配置来新增支持的文件扩展名,或者重写整个白名单 更多上传配置项:https://github.com/eggjs/egg-multipart

  • 新增支持的文件扩展名
    module.exports = {
    multipart: {
    fileExtensions: [ '.apk' ] // 增加对 apk 扩展名的文件支持
    },
    };
  • 覆盖整个白名单
    module.exports = {
    multipart: {
    whitelist: [ '.png' ], // 覆盖整个白名单,只允许上传 '.png' 格式
    },
    };

  • [ ] 多文件上传代码:
    
    'use strict';

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

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

class UserController extends Controller {

/**
 * 多文件上传
 */
async uploadMore() {
    const {ctx} = this

    // 获取多个文件提交的数据流,多文件上传专用
    const parts = ctx.multipart({ autoFields:true })
    const files = []

    let stream
    while( ( stream = await parts() ) != null )
    {
        // 判断用户是否选择上传图片
        if (!stream.filename)
        {
            ctx.throw('请选择上传的图片!')
            return
        }
        // filename 获取上传的文件名 xxx.jpg
        const filename = stream.filename.toLowerCase()

        // fieldname 获取文件表单提交的字段名称 
        const fieldname = stream.fieldname

        // 拼接上传路径
        const target = 'app/public/admin/uploads/'+path.basename(filename)

        // 创建可写流
        const writeStream = fs.createWriteStream(target)

        // 读取文件 && 写入 && 销毁当前流
        await pump(stream, writeStream)

        files.push({
            [fieldname]: target
        })
    }

    ctx.body = {
        files,
        fields:parts.field
    }
}

}

module.exports = UserController;