多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### egg 多文件上传 >[danger] 如果要获取同时上传的多个文件,不能通过`ctx.getFileStream()`来获取 > 需要通过 ctx.multipart({ autoFields:true }) 获取 > autoFields: true 表示获取除了文件字段以外的其他信息字段 用户可以通过在`config/config.default.js`中配置来新增支持的文件扩展名,或者重写整个白名单 更多上传配置项:[https://github.com/eggjs/egg-multipart](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; ```