Я новичок в потоковой передаче ... Я передаю файл с 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-адресе изображения, потому что оно не всегда там. Заголовок типа контента кажется более надежным способом.