Я пытаюсь сделать запрос POST для загрузки двоичного файла на сервер, и данные формы отправляются неправильно (или вообще не отправляются).
Моя текущая интеграция node-fetch с puppeteer работает нормально для запросов POST или GET с {"Content-Type": "application/json"}
.
Вот мой код:
const FormData = require("form-data");
const fetch = require("node-fetch");
const fs = require("fs");
upload(pkgUrl) {
return new Promise(async (resolve, reject) => {
const token = ...
const url = ...
const stats = fs.statSync(pkgUrl);
const fileSizeInBytes = stats.size;
console.log("fileSizeInBytes " + fileSizeInBytes); // Prints a valid size
const form = new FormData();
form.append("version", "1.0");
form.append("appFile", fs.createReadStream(pkgUrl));
form.append("minFirmwareVersion", 8164134);
form.append("newPackage", true);
let headers = form.getHeaders();
headers["csrf-token"] = token;
const response = await this._makeHTTPRequest(url, "POST", headers, form);
(...)
});
}
_makeHTTPRequest(url, method = "GET", headers = null, body = null, parse = true) {
return new Promise(async (resolve, reject) => {
try {
const response = await this._page.evaluate(async (url, method, headers, body, parse) => {
let request = {
method: method,
credentials: "include"
};
if (headers) {
request["headers"] = headers;
}
if (body) {
request["body"] = body;
}
// Make request
const fetchResponse = await fetch(url, request);
// Return parsed (object) or plain-text response
return parse ? await fetchResponse.json() : await fetchResponse.text();
}, url, method, headers, body, parse);
resolve(response);
} catch (error) {
reject(error);
}
});
}
Вот как данные формы должны быть отправлены:
И вот как отправляется:
Кроме того, длина отправляемого содержимого составляет всего 15 байтов, и она должна быть около 2 МБ.
Правильно ли я использую данные форм и выборки узлов?
Спасибо!