@sourceloop/file-utils

中文文档
0.7.2发布于 2026/11/02MITTypeScriptCommonJS构建来源已验证

用于loopback应用程序的文件上传和多部分相关实用程序

中文使用文档
文档目录9 节
  1. 安装
  2. 使用
  3. 多部分请求装饰器
  4. 文件装饰
  5. 文件验证
  6. ClamAV
  7. 限制的配置
  8. 贡献
  9. 许可证

文件跑龙套

这个包提供了在LoopBack 4微服务中添加文件上传和验证的实用程序。

安装

安装软件包的命令如下:

npm install @sourceloop/file-utils

使用

  • 绑定组件并添加需求绑定。
this.bind(AWSS3Bindings.Config).to({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: process.env.AWS_REGION,
} as AwsS3Config);

this.component(FileUtilComponent);

有两种方法可以在控制器中接受多部分请求

  • 添加 multipartRequestBody 修饰符到你想要接受带有/不带有文件的多部分请求体的控制器方法
  @post(`/parents/no-model-metadata`)
  @response(200, {
    description: 'Parent without config model instance',
    content: {
      'application/json': {schema: getModelSchemaRef(ParentWithConfig)},
    },
  })
  async createWithOutModelConfig(
    @multipartRequestBody(ParentWithConfig)
    data: ParentWithModelConfig,
  ): Promise<void> {
    ...
  }

你可以阅读更多关于这个装饰 在这里

  • 添加 file 修饰符到控制器方法,您希望在其中处理文件
@file(getJsonSchema(Parent) as SchemaObject, ['file'], ['.csv'])
data: ParentWithFile,

您可以阅读更多关于文件装饰器及其参数的信息 在这里

多部分请求装饰器

这个装饰器允许 multipart/form-data 请求主体,包含任意多的字段和文件。它要求您为请求定义一个模型,如果任何字段是文件类型,则需要用 @fileProperty -

@model()
export class ParentWithConfig extends Entity {
  @property({
    type: 'string',
    id: true,
  })
  id?: string;

  @property({
    type: 'string',
    required: true,
  })
  name: string;

  // file field
  @fileProperty({
    type: 'object',
    // you can configure individual fields here
    validators: [FileTypeValidator],
    extensions: ['.png', '.txt'],
  })
  file: Express.Multer.File;

  constructor(data?: Partial<ParentWithConfig>) {
    super(data);
  }
}

文件装饰

这个装饰器被设计用来处理单个文件的上传 multipart/form-data 请求。它提供了一种结构化的方式来管理请求主体中的多个字段,包括文件字段。

参数

  • 模式 (SchemaObject):

    • 请求主体的模式对象。在您有多个字段并且希望以结构化的方式处理这些数据的情况下,它非常有用。例如,如果您的请求有一个文件字段和一个名称字段,您可以用这些字段定义一个模式对象,并将其传递给装饰器。文件字段将在模式中被标记为二进制。
  • filefield (string[]):

    • 模式中表示文件上传的字段。所以根据上面的例子,你可以通过 ['file'] 到此参数。这将在模式中将文件字段标记为二进制。
  • allowedExtensions (string[]):

    • 上传文件允许的文件扩展名。
  • storageOptions (IFileStorageOptions<T>):

    • 文件存储的选项。这支持任何多存储引擎类。默认情况下,它使用内存存储,并且包还提供S3存储引擎。

S3存储引擎

默认情况下,文件存储在内存中,但是这个包也提供了一个基于s3的存储引擎,要使用它,您需要安装 loopback4-s3 包- npm i loopback4-s3 然后你可以在构型属性中给出它 @fileProperty 或者 @file 修饰符。您还需要全局绑定它,如下所示

import {MulterS3Storage} from '@sourceloop/file-utils/s3';
...
// inside component/application constructor
this.service(MulterS3Storage);

文件验证

默认情况下,包提供了两个验证器

  • FileTypeValidator -根据配置验证文件的类型
  • FileNameValidator -验证文件名,以避免文件名中出现某些特殊字符

您可以编写自己的自定义验证器,并使用 @fileValidator 装饰器,每个验证器必须实现 IFileValidator 界面,

@fileValidator()
export class FileSizeValidator implements IFileValidator {
  ...
}

ClamAV

该包提供了一个基于ClamAV的验证器,要使用它,您需要安装 clamscan 包- npm i clamscan 然后在应用程序中绑定验证器。这是…

this.service(ClamAVValidator);

限制的配置

的实例来配置多实例 IFileLimitsGetter 在 FileUtilBindings.LimitProvider 关键,

this.bind(FileUtilBindings.LimitProvider).to({
  get() {
    // this is the default limits in the package
    fileSize: FIVE * MB, // 5 MB
    files: 1,
  }
});


// OR you can use a class or any other type of binding as long as it returns
// an instance of `IFileLimitsGetter-
this.bind(FileUtilBindings.LimitProvider).toClass(MulterConfigService);

您还需要在模型文件中使用以下配置来更新模型装饰器-

@model({
  settings: {multer: {limitsProvider: true}},
})
export class TestModel extends Entity {}

贡献

欢迎投稿!请参阅 贡献指南 了解更多信息。

许可证

这个包裹是 麻省理工学院的许可.

版本与发布记录

@sourceloop/file-utils 共发布 31 个版本,首次发布于 2024/08/15;过去 12 个月发布了 9 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.7.2latest2026/11/02今天
0.7.12026/09/101 个月前
0.7.02026/08/162 个月前
0.6.02026/06/194 个月前
0.5.62026/03/097 个月前
0.5.52026/02/208 个月前

关于 @sourceloop/file-utils 的常见问题

@sourceloop/file-utils 是什么?

用于loopback应用程序的文件上传和多部分相关实用程序

如何安装 @sourceloop/file-utils?

在项目目录运行 npm install @sourceloop/file-utils,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@loopback/core(^7.0.3)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@sourceloop/file-utils 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@sourceloop/file-utils 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@sourceloop/file-utils 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js 22 || 24。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@sourceloop/file-utils 可以商用吗?

@sourceloop/file-utils 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@sourceloop/file-utils 还在维护吗?

最新版本 0.7.2 发布于 2026/11/02(今天);至今共发布 31 个版本,其中过去 12 个月发布了 9 个;首次发布于 2024/08/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。