為了處理文件上傳,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() 接收兩個參數:
FileInterceptor() 可能不兼容諸如 Google Firebase 之類的第三方云服務商。
為了上傳文件數組,我們使用 FilesInterceptor()。請使用 FilesInterceptor() 裝飾器(注意裝飾器名稱中的復數文件)。這個裝飾器有三個參數:
使用 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() 裝飾器。這個裝飾器有兩個參數:
使用 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,
});
一個能夠運行的樣例在這里。
更多建議: