NestJS вернуть фу из GridFS - PullRequest
       59

NestJS вернуть фу из GridFS

0 голосов
/ 09 февраля 2019

Я пытаюсь вернуть файл из GridFS, используя мой контроллер Nest.Насколько я могу судить, nest не соблюдает мой пользовательский заголовок content-type, для которого я установил application/zip, так как по возвращении я получаю тип текстового содержимого (см. Скриншот).

данные ответаimage, неправильный заголовок типа содержимого

Мой контроллер гнезд выглядит следующим образом

  @Get(':owner/:name/v/:version/download')
  @Header('Content-Type', 'application/zip')
  async downloadByVersion(@Param('owner') owner: string, @Param('name') name: string, @Param('version') version: string, @Res() res): Promise<any> {
    let bundleData = await this.service.getSwimbundleByVersion(owner, name, version);
    let downloadFile = await this.service.downloadSwimbundle(bundleData['meta']['fileData']['_id']);   
    return res.pipe(downloadFile);
  }

Вот вызов службы

downloadSwimbundle(fileId: string): Promise<GridFSBucketReadStream> {
      return this.repository.getFile(fileId)
    }

, который по сути является проходом-после этого.

  async getFile(fileId: string): Promise<GridFSBucketReadStream> {
    const db = await this.dbSource.db;
    const bucket = new GridFSBucket(db, { bucketName: this.collectionName });
    const downloadStream = bucket.openDownloadStream(new ObjectID(fileId));

    return new Promise<GridFSBucketReadStream>(resolve => {
        resolve(downloadStream)
      });
  }

Моя конечная цель - вызвать конечную точку download и зарегистрировать браузер в качестве zip-файла и загрузить его вместо просмотра двоичного файла в браузере.Будем весьма благодарны за любые указания относительно того, что нужно сделать, чтобы туда добраться.Спасибо за чтение

1 Ответ

0 голосов
/ 10 февраля 2019

Вам также необходимо установить заголовок Content-Disposition с именем файла.Вы можете использовать декоратор @Header(), если имя файла всегда будет одинаковым, или setHeader непосредственно в объекте ответа, если вам нужно будет отправлять обратно разные имена файлов на основе какого-либо параметра в вашем контроллере.

Оба следующих примера методов контроллера работают для отправки обратно загружаемого файла в браузер из моей локальной файловой системы.

@Get('/test')
@Header('Content-Type', 'application/pdf')
@Header('Content-Disposition', 'attachment; filename=something.pdf')
getTest(@Res() response: Response) {
   const data = createReadStream(path.join(__dirname, 'test.pdf'));
   data.pipe(response);
}

@Get('/test')
@Header('Content-Type', 'application/pdf')
getTest(@Res() response: Response) {
   const data = createReadStream(path.join(__dirname, 'test.pdf'));

   response.setHeader(
     'Content-Disposition',
     'attachment; filename=another.pdf',
   );

   data.pipe(response);
}
...