midwayjs上传文件_midwaysjs上传配置_上传问题处理
2024-11-23 14:48:52
本篇文章介绍了使用midwaysjs上传的基本配置与遇到的问题
1070
一、正常安装上传依赖
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卸载删除。