У меня есть клиентское приложение, в которое пользователи могут загружать изображения. Я получаю это изображение в своем приложении Node JS как читаемые данные, а затем манипулирую им перед сохранением следующим образом:
uploadPhoto: async (server, request) => {
try {
const randomString = `${uuidv4()}.jpg`;
const stream = Fse.createWriteStream(`${rootUploadPath}/${userId}/${randomString}`);
const resizer = Sharp()
.resize({
width: 450
});
await data.file
.pipe(resizer)
.pipe(stream);
Это работает нормально и записывает файл в локальный каталог проекта. Проблема возникает, когда я снова пытаюсь использовать те же читаемые данные в той же функции asyn c. Обратите внимание, весь этот код находится в блоке try.
const stream2 = Fse.createWriteStream(`${rootUploadPath}/${userId}/thumb_${randomString}`);
const resizer2 = Sharp()
.resize({
width: 45
});
await data.file
.pipe(resizer2)
.pipe(stream2);
Второй файл записан, но когда я проверяю файл, он кажется поврежденным или не удалось успешно записать данные. Первое изображение всегда в порядке.
Я пробовал несколько вещей и нашел один метод, который, кажется, работает, но я не понимаю почему. Я добавляю этот код непосредственно перед созданием второго потока записи:
data.file.on('end', () => {
console.log('There will be no more data.');
});
Помещение кода для второго потока записи внутри блока обратного вызова на конце не имеет значения, однако, если я оставлю код вне блока, между первым кодом потока записи и вторым кодом потока записи, тогда он работает, и оба файла успешно записаны.
Неправильно оставлять код таким, какой он есть . Есть ли лучший способ написать изображение второго ногтя большого пальца? Я пытался использовать модуль Sharp для чтения файла после того, как первый поток записи записывает данные, а затем создать его уменьшенную версию, но это не работает. Кажется, что файл никогда не готов к использованию.