поток - создать имя файла на основе ответа - PullRequest
0 голосов
/ 18 января 2019

Я новичок в потоковой передаче ... Я передаю файл с request и сохраняю его во временном каталоге под новым именем, указанным в запросе. Но я хочу добавить расширение файла на основе заголовка 'Content-type' в ответе.

  const tempDir = path.join((global as any).appRoot, 'tempDir');
  let filePath = path.join(tempDir, req.body.fileName);
  // download file to temp dir
  request({ url: req.body.imageUrl, encoding: null })
    .on('response', response => {
      let ext = '.jpg'; // default
      const hdrs = response.headers;
      if (hdrs && hdrs['content-type']) {
        const contentType = hdrs['content-type'];
        let parts = contentType.split('/');
        let type = parts[1];
        if (type) {
          if (type === 'jpeg') {
            type = 'jpg';
          }
          ext = `.${type}`;
        }
      }
      filePath = filePath + ext
    })
    .on('error', err => res.send({ error: 'stream error: ' + err }))
    .pipe(fs.createWriteStream(filePath, {
      encoding: 'binary'
    }));

Проблема в том, что изображение всегда сохраняется с указанным в запросе файлом fileName, но без расширения, потому что цепочечный метод pipe передается filePath в момент до того, как он будет дополнен расширением, которое установлено в .on('response') слушатель. Как я мог настроить это так, чтобы это получило расширение?

В качестве примечания: я не могу использовать расширение в URL-адресе изображения, потому что оно не всегда там. Заголовок типа контента кажется более надежным способом.

...