У меня есть приложение, которое выполняет синхронизацию между двумя API: JAZZ RT C и HPALM.
Теперь я могу синхронизировать файлы из RT C в HPALM, только если я сохраню их временно на диск, как показано ниже:
Rtc.getAttachment(itemId)
.then(data => { // <--- data is array of bytes
fs.writeFileSync(
path.join(__dirname, 'tmp_attachments', filename),
data
);
let file = fs.createReadStream(__dirname, 'tmp_attachments', filename);
const formData = {
bin: file
};
let uploadOptions = {
headers: {
Accept: 'application/json',
},
url: 'blablabla,
formData: formData
};
request.post(uploadOptions, function (error, response, body) {
if (error) throw error;
else console.log(body);
});
});
Приведенный выше код работает отлично, но теперь я хотел бы напрямую отправлять полученные байты без необходимости сохранять их в виде файла. Я попытался:
Rtc.getAttachment(itemId)
.then(data => { // <--- data is array of bytes
const formData = {
bin: data,
name: 'myFile.xlsx'
};
let uploadOptions = {
headers: {
Accept: 'application/json',
'Content-Type': 'multipart/form-data; boundary=---------328649490520098662907564',
'Content-Length': data.byteLength
},
url: 'blablabla,
formData: formData
};
request.post(uploadOptions, function (error, response, body) {
if (error) throw error;
else console.log(body);
});
});
Приведенный выше код всегда дает сбой с ответом: {"error":"Invalid POST request"}
Итак, мои вопросы:
1. Что такое разница между массивом байтов и fs.createReadStream («файл, содержащий массив байтов»)?
2. Я также заметил, что data.byteLength отличается от content-length
(непосредственно устанавливается запросом) первого кода блока. Почему?
3. Как правильно отправить массив байтов в виде файла?
Большое вам спасибо