midwayjs上传文件_midwaysjs上传配置_上传问题处理
2025-11-03 09:22:03
本篇文章介绍了使用midwaysjs上传的基本配置与遇到的问题
2182
一、正常安装上传依赖
npm i @midwayjs/upload@3 --save
二、启用组件
import { Configuration } from '@midwayjs/core';
import * as upload from '@midwayjs/upload';
@Configuration({
imports: [
// ...other components
upload
],
// ...
})
export class MainConfiguration {}
三、新增配置
// src/config/config.default.ts
import { uploadWhiteList } from '@midwayjs/upload';
import { tmpdir } from 'os';
import { join } from 'path';
export default {
// ...
upload: {
// mode: UploadMode, 默认为file,即上传到服务器临时目录,可以配置为 stream
mode: 'file',
// fileSize: string, 最大上传文件大小,默认为 10mb
fileSize: '10mb',
// whitelist: string[],文件扩展名白名单
whitelist: uploadWhiteList.filter(ext => ext !== '.pdf'),
// tmpdir: string,上传的文件临时存储路径
tmpdir: join(tmpdir(), 'midway-upload-files'),
// cleanTimeout: number,上传的文件在临时目录中多久之后自动删除,默认为 5 分钟
cleanTimeout: 5 * 60 * 1000,
// base64: boolean,设置原始body是否是base64格式,默认为false,一般用于腾讯云的兼容
base64: false,
// 仅在匹配路径到 /api/upload 的时候去解析 body 中的文件信息
match: //api/upload/,
},
}
四、获取上传的文件
没有swagger组件:
import { Controller, Inject, Post, Files, Fields } from '@midwayjs/core';
@Controller('/')
export class HomeController {
@Inject()
ctx;
@Post('/upload')
async upload(@Files() files, @Fields() fields) {
/*
files = [
{
filename: 'test.pdf', // 文件原名
data: '/var/tmp/xxx.pdf', // mode 为 file 时为服务器临时文件地址
fieldname: 'test1', // 表单 field 名
mimeType: 'application/pdf', // mime
},
{
filename: 'test.pdf', // 文件原名
data: ReadStream, // mode 为 stream 时为服务器临时文件地址
fieldname: 'test2', // 表单 field 名
mimeType: 'application/pdf', // mime
},
// ...file 下支持同时上传多个文件
]
*/
return {
files,
fields
}
}
}
使用swagger组件:(其中额外属性在fields中)
//dto文件
export class FileDto extends MockDto {
@ApiProperty({
type: 'string',
format: 'binary',
description: '文件',
})
files: any;
@Rule(RuleType.string())
@ApiProperty({ example: 'example', description: '文件的fileMD5' })
fileMD5: string;
}
//serve文件
import { FileDto} from './dto';
import { ApiQuery, ApiOperation, ApiBody, BodyContentType } from '@midwayjs/swagger';
import { Post, Body, Files, Fields} from '@midwayjs/decorator';
@ApiOperation({ summary: '上传文件' })
@Post('/upload/file')
//使用Validate(),并在参数中使用dto
@Validate()
@ApiBody({
contentType: BodyContentType.Multipart
})
async upploadFile(@Body() params: FileDto, @Files() files, @Fields() fields) {
let url = await this.commonService.uploadFile(files, fields.md5);
return {
success: true,
message: this.i18nService.translate('returnSuccess'),
data: {
...url,
},
};
}
常见问题:
- 在vue-cli中与 开发环境不会有问题,在生产环境中会遇到****.upload.addEventListener is not a function

vue-cli中的mockjs模块把XMLHttpRequest覆盖拦截了,会导致对象属性访问不到,所以把mokejs卸载删除。
