Skip to content

Upload文件上传

VonaJS 基于busboy实现了文件上传的能力

单文件上传

typescript
class ControllerStudent {
  @Web.post('file')
  @Core.fileUpload()
  @Api.contentType('application/json')
  async uploadFile(
    @Arg.file('file1', v.title('Upload Single File')) file1: IUploadFile,
  ) {
    console.log(file1);
    return file1.file;
  }
}
  • @Core.fileUpload: 此装饰器用于启用 Upload 拦截器。该拦截器解析上传文件,并存入临时文件。在完成业务逻辑之后,该拦截器将自动清理临时文件
  • @Api.contentType: 如果 API 要返回 JSON 数据,最好明确指定application/json。因为有的客户端在发送 API 请求时,可能没有提供明确的 ContentType
  • @Arg.file: 此装饰器用于标注参数file1,从上传的数据中取得name=file1的文件

IUploadFile

名称说明
name文件字段名
file临时文件路径
info.filename文件名
info.encoding文件编码
info.mimeType文件类型

如下图所示:

多文件上传

typescript
class ControllerStudent {
  @Web.post('files')
  @Core.fileUpload()
  @Api.contentType('application/json')
  async uploadFiles(
    @Arg.files('files', v.title('Upload Multiple Files')) files: IUploadFile[],
  ) {
    console.log(files);
    return files.map(item => item.file);
  }
}
  • @Arg.files: 此装饰器用于标注参数files,从上传的数据中取得name=files的文件

表单字段

在上传文件的同时,也可以附加多个表单字段

对于数组类型的字段,前端在构造上传数据时,采用的方式不同,就需要使用不同的参数装饰器

1. @Arg.field

  • 前端
typescript
const formData = new FormData();
formData.append('name', 'vona');
formData.append('tags', ['node', 'typescript']);
  • API
diff
export class ControllerStudent extends BeanBase {
  @Web.post('file')
  @Core.fileUpload()
  @Api.contentType('application/json')
  async uploadFile(
+   @Arg.field('name', v.title('Name')) name: string,
+   @Arg.field('tags', v.title('Tags'), v.array(z.string())) tags: string[],
    @Arg.file('file1', v.title('Upload Single File')) file1: IUploadFile,
  ) {
    console.log(name, tags);
    console.log(file1);
    return file1.file;
  }
}
  • @Arg.field: 此装饰器用于标注参数name/tags,从上传的数据中取得name=name/tags的字段值

2. @Arg.fields

  • 前端
typescript
const formData = new FormData();
formData.append('name', 'vona');
formData.append('tags', 'node');
formData.append('tags', 'typescript');
  • API
diff
export class ControllerStudent extends BeanBase {
  @Web.post('file')
  @Core.fileUpload()
  @Api.contentType('application/json')
  async uploadFile(
+   @Arg.field('name', v.title('Name')) name: string,
+   @Arg.fields('tags', v.title('Tags'), v.array(z.string())) tags: string[],
    @Arg.file('file1', v.title('Upload Single File')) file1: IUploadFile,
  ) {
    console.log(name, tags);
    console.log(file1);
    return file1.file;
  }
}
  • @Arg.fields: 此装饰器用于标注参数tags,从上传的数据中取得name=tags的字段值

基于 MIT 许可发布