多文件上传
优质
小牛编辑
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;