createReadStream () с использованием файла в памяти (Multer memoryStorage) - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь отправить изображение 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 в опциях запроса, если вы будете следовать этому.Не будьте такими, как я, и проведите день, отслеживая, почему ваши возвращенные данные имеют инопланетный формат.:)

...