NestJS 文件上傳

2023-09-08 18:11 更新

為了處理文件上傳,Nest 提供了一個內置的基于 multer 中間件包的 Express 模塊。Multer 處理以 multipart/form-data 格式發(fā)送的數據,該格式主要用于通過 HTTP POST 請求上傳文件。這個模塊是完全可配置的,您可以根據您的應用程序需求調整它的行為。

Multer無法處理不是受支持的多部分格式( multipart/form-data )的數據。 另外,請注意此程序包與 FastifyAdapter 不兼容。

為了更好的類型安全,我們來安裝 Multer 的類型聲明包:

$ npm i -D @types/multer

只要這個模塊被安裝,我們就可以使用 Express.Multer.File 這個類型(你可以通過 import { Express } from 'express' 導入這個類型)。

基本實例

當我們要上傳單個文件時, 我們只需將 FileInterceptor() 與處理程序綁定在一起, 然后使用 @UploadedFile() 裝飾器從 request 中取出 file。

@Post('upload')
@UseInterceptors(FileInterceptor('file'))
uploadFile(@UploadedFile() file: Express.Multer.File) {
  console.log(file);
}

FileInterceptor() 裝飾器是 @nestjs/platform-express 包提供的, @UploadedFile() 裝飾器是 @nestjs/common 包提供的。

FileInterceptor() 接收兩個參數:

  • 一個 fieldName (指向包含文件的 HTML 表單的字段)
  • 可選 options 對象, 類型為 MulterOptions 。這個和被傳入 multer 構造函數 (此處有更多詳細信息) 的對象是同一個對象。

FileInterceptor() 可能不兼容諸如 Google Firebase 之類的第三方云服務商。

文件數組

為了上傳文件數組,我們使用 FilesInterceptor()。請使用 FilesInterceptor() 裝飾器(注意裝飾器名稱中的復數文件)。這個裝飾器有三個參數:

  • fieldName:(保持不變)
  • maxCount:可選的數字,定義要接受的最大文件數
  • options:可選的 MulterOptions 對象 ,如上所述

使用 FilesInterceptor() 時,使用 @UploadedFiles() 裝飾器從 request 中提取文件。

@Post('upload')
@UseInterceptors(FilesInterceptor('files'))
uploadFile(@UploadedFiles() files: Array<Express.Multer.File>) {
  console.log(files);
}

FilesInterceptor() 裝飾器是 @nestjs/platform-express 包提供的, @UploadedFiles() 裝飾器是 @nestjs/common 包提供的。

多個文件

要上傳多個文件(全部使用不同的鍵),請使用 FileFieldsInterceptor() 裝飾器。這個裝飾器有兩個參數:

  • uploadedFields:對象數組,其中每個對象指定一個必需的 name 屬性和一個指定字段名的字符串值(如上所述),以及一個可選的 maxCount 屬性(如上所述)
  • options: 可選的 MulterOptions 對象,如上所述

使用 FileFieldsInterceptor() 時,使用 @UploadedFiles() 裝飾器從 request 中提取文件。

@Post('upload')
@UseInterceptors(FileFieldsInterceptor([
  { name: 'avatar', maxCount: 1 },
  { name: 'background', maxCount: 1 },
]))
uploadFile(@UploadedFiles() files: { avatar?: Express.Multer.File[], background?: Express.Multer.File[] }) {
  console.log(files);
}

任何文件

要使用任意字段名稱鍵上載所有字段,請使用 AnyFilesInterceptor() 裝飾器。該裝飾器可以接受如上所述的可選選項對象。

使用 AnyFilesInterceptor() 時,使用 @UploadedFiles() 裝飾器從 request 中提取文件。

@Post('upload')
@UseInterceptors(AnyFilesInterceptor())
uploadFile(@UploadedFiles() files: Array<Express.Multer.File>) {
  console.log(files);
}

默認選項

您可以像上面描述的那樣在文件攔截器中指定 multer 選項。要設置默認選項,可以在導入 MulterModule 時調用靜態(tài) register() 方法,傳入受支持的選項。您可以使用這里列出的所有選項。

MulterModule.register({
  dest: '/upload',
});

MulterModule 類是 @nestjs/platform-express 包提供的。

異步配置

當需要異步而不是靜態(tài)地設置 MulterModule 選項時,請使用 registerAsync() 方法。與大多數動態(tài)模塊一樣,Nest 提供了一些處理異步配置的技術。

第一種可能的方法是使用工廠函數:

MulterModule.registerAsync({
  useFactory: () => ({
    dest: '/upload',
  }),
});

與其他工廠提供程序一樣,我們的工廠函數可以是異步的,并且可以通過 inject 選項注入依賴。

MulterModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    dest: configService.getString('MULTER_DEST'),
  }),
  inject: [ConfigService],
});

或者,您可以使用類而不是工廠來配置 MulterModule,如下所示:

MulterModule.registerAsync({
  useClass: MulterConfigService,
});

上面的構造在 MulterModule 中實例化 MulterConfigService ,使用它來創(chuàng)建所需的選項對象。注意,在本例中,MulterConfigService 必須實現 MulterOptionsFactory 接口,如下所示。MulterModule 將在提供的類的實例化對象上調用 createMulterOptions() 方法。

@Injectable()
class MulterConfigService implements MulterOptionsFactory {
  createMulterOptions(): MulterModuleOptions {
    return {
      dest: '/upload',
    };
  }
}

如果你想要重復使用一個已經存在的選項提供者而不是在 MulterModule 內創(chuàng)建一個私有的拷貝,使用 useExisting 語法。

MulterModule.registerAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
});

例子

一個能夠運行的樣例在這里。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號