如何在带有 nestjs 的同一控制器中使用多个 diskStorage 目的地

How to use multiple diskStorage destinations in same controller with nestjs

我有一个设置了两条路由的上传控制器。一份用于 files,一份用于 photos。它们本质上是相同的,但我有不同的 diskStorage 目的地。问题是控制器中最后一个似乎是为两条路线设置的 diskStorage 。这可能只是我对事情如何运作的误解,但似乎我应该能够做到这一点。现在的设置方式是,files 保存在 photos 文件夹中,因为 photos 路由是最后一个,但是如果我交换路由的顺序,它们就会保存在 files 预期的文件夹。这是代码片段。

  @Post('files')
  @UseInterceptors(FilesInterceptor('files', null, {
    storage: diskStorage({
      destination: `${__dirname}../../../uploads/files`,
        filename: (req, file, cb) => {
          const randomName = 'a random name';
          cb(null, `${randomName}${extname(file.originalname)}`);
        },
    }),
  }))
 async upload(@UploadedFiles() files) {
    return files;
  }

  @Post('photos')
  @UseInterceptors(FilesInterceptor('files', null, {
    storage: diskStorage({
      destination: `${__dirname}../../../uploads/photos`,
        filename: (req, file, cb) => {
          const randomName = 'a random name';
          cb(null, `${randomName}${extname(file.originalname)}`);
        },
    }),
  }))
  async uploadPhotos(@UploadedFiles() photos) {
    return photos;
  }

更新

Fixed in v5.2.0. Will publish soon

应该通过更新到刚刚发布的 v5.2.0 来解决。

原答案

我认为这是 FilesInterceptor 的错误。我已经为它打开了 Github issue

作为解决方法,您可以使用 FileInterceptor(对于单个文件)或在两个不同的 @Controller 中定义两个端点 filesphotos。当我在本地测试时,这两种方式都有效。