Хорошо, поэтому после долгих попыток и экспериментов я выяснил, почему вышеприведенный код не работает.Прежде всего, тип содержимого в строке postdata должен быть установлен на image /, но это маленький, на самом деле это не было причиной, почему это не сработало.
Ошибка EPIPE или сети произошла из-за того, что я установил заголовок Content-Length неправильной длины.Вместо того, чтобы просто устанавливать его в длину строки, он должен быть установлен в ByteLength строки.Так что просто замените 'Content-Length': postData.length.toString()
на 'Content-Length': Buffer.byteLength(postData).toString()
.Это должно решить ошибку EPIPE.
Но есть еще одна проблема: я, по сути, преобразую все данные в одну большую строку данных (postData) и отправляю всю строку за одну req.write(postData)
операцию.Таким образом, очевидно, что это не то, как нужно это делать (опять же после долгих экспериментов), вместо этого нужно отправить массив, содержащий отдельные строки данных, а затем записать каждый элемент массива в запрос http.Итак, по существу:
// instead of this string:
const postData = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n" + apiKey + "\r\n--" + boundary + "Content-Disposition: form-data; name=\"image1\"; filename=\"IMG_7264.JPG\"\r\nContent-Type: image/jpeg \r\n\r\n" + image1 + "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"image1\"; filename=\"IMG_7264.JPG\"\r\nContent-Type: image/jpeg\r\n\r\n" + image2 + "\r\n--" + boundary + "--";
// use this array:
const postData = [`--${boundary}`, `\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\n`, apiKey, `\r\n--${boundary}\r\n`, `Content-Disposition: form-data; name=\"image1\"; filename=\"IMG_7264.JPG\"\r\n`, `Content-Type: image/jpeg \r\n\r\n`, image1, `\r\n--${boundary}\r\n`, `Content-Disposition: form-data; name=\"image1\"; filename=\"IMG_7264.JPG\"\r\n`, `Content-Type: image/jpeg\r\n\r\n`, image2, `\r\n--${boundary}--`];
, а затем в фактическом запросе вы должны записать этот массив в элемент http-запроса по элементу:
// instead of simply
req.write(postData)
// do:
for(let data of postData) {
req.write(data);
}
также обязательно добавьте некоторые функции длявычисление длины заголовка содержимого, которое учитывает, что тело теперь хранится в массиве, что-то вроде этого должно сделать работу:
const postDataLength = postData.reduce((acc, curr) => acc += Buffer.byteLength(curr), 0)
А затем просто установить атрибут заголовка Content-Length
равным postDataLength
.
Надеюсь, это поможет любому, кто пытается создать запрос на публикацию данных формы с нуля, вместо использования сторонней библиотеки, такой как request
, которая также разберется с вами.