Я пытаюсь отправить изображение multipart/form-data
на другой сервер, используя unirest.Их .attach()
работает с fs.createReadStream()
, однако мне не удалось преобразовать буфер в изображение.Логический шаг - сначала преобразовать буфер в Uint8Array, а затем создать поток чтения из него.Однако, это выдает сообщение об ошибке, говорящее, что массив не должен содержать нулевые значения.Удаление 0
записей из массива почти наверняка разрушит изображение.
Изображение не равно нулю, имеет все байты, и даже отправка данных изображения в виде гигантской строки работает.
Вотчто я пробовал:
imageBytes = new Uint8Array(image.buffer)
unirest
.post(someURL)
.headers(headers)
.attach("image", fs.createReadStream(imageBytes))
.end(response => {
console.log(response.body);
});
Альтернативы:
1. Непосредственное присоединение буфера, который отправляет необработанные данные в виде поля формы.Не идеально, и может столкнуться с ограничениями размера изображения.
2. Запишите файл в хранилище, а не храните его в памяти.Это будет обрабатывать некоторую конфиденциальную информацию, поэтому потребуется автоматическое удаление после определенного промежутка времени, что приведет к дополнительной работе.
РЕДАКТИРОВАТЬ: я в конечном итоге переключился на request
, так как это позволило встроенные «файлы»из буферов.Код для этого приведен ниже:
request({
uri: someURL,
method: "POST",
formData: {
"image": {
value: image.buffer,
options: {
filename: image.originalname,
contentType: image.mimetype
}
}
}
}, (err, resp, body) => {
if (err) {
console.log("ERROR -> " + err)
}
if (body) {
console.log(body)
}
})
РЕДАКТИРОВАТЬ2: Пожалуйста, также введите encoding: null
в опциях запроса, если вы будете следовать этому.Не будьте такими, как я, и проведите день, отслеживая, почему ваши возвращенные данные имеют инопланетный формат.:)