javascript - multipart/form-data 中的 blob 作为 [object Blob] 使用 XMLHttpRequest 发送
问题描述
我有一个二进制文件,我想在 multipart/form-data POST 请求中发送。我想在我的javascript中包含二进制文件,所以我找到了一个将base64字符串转换为blob的javascript函数,它在下面。
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 用作使用 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);
它传输数据包中的二进制数据。
为什么第一个函数不发送二进制文件?
解决方案
推荐阅读
- python - 在 Python 3.x 中转义特殊字符
- python - 用户创建指定类的对象
- java - 片段中的自定义列表视图。未找到布局
- azure-storage - 使用系统分配的托管标识将 Azure 流分析输出到 Data Lake Storage Gen2
- c++ - 用 C++ 读取文件,包括空格键
- object-detection - 在 sagemaker 中使用带有对象检测 API 的 tensorboard
- python-2.7 - 如何在unittest mock python中使用类变量条件
- jqgrid - jqGrid复选框分组总结
- python - pip 没有在 cmd 中显示
- java - JPA 通过 Api Key 查找返回 null