У меня есть двоичный файл, который я хочу отправить в POST-запросе multipart / form-data. Я хочу включить двоичный файл в свой javascript, поэтому я нашел функцию javascript для преобразования строки base64 в большой двоичный объект, это ниже.
var b64data = 'blablabla';
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const contentType = 'application/x-gzip';
const payload = b64toBlob(b64data, contentType);
Затем я использую этот BLOB-объект как часть multipart / form-data send с XMLHttpRequest. Соответствующий код:
function fileUpload(url, fileData, fileName, nameVar, ctype) {
var fileSize = fileData.length,
boundary = "ABCDEFGHIFD",
xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="' + nameVar +'"; filename="' + fileName + '"\r\n';
body += "Content-Type: " + ctype + "\r\n\r\n";
//body += fileData;
end = "\r\n--" + boundary + "--";
//var body = fileData;
xhr.send(body + fileData + end);
return true;
}
Когда я передаю полезную нагрузку в функцию, такую как fileUpload(url,payload,fileName,nameVar,ctype);
, часть, которая должна быть двоичными данными, просто передается как [object Blob]
. Если я достану тело и отправлю только файл данных,
var body = fileData;
xhr.send(body);
Передает двоичные данные в пакете.
Почему первая функция не передает двоичный файл?