Javascript 使用XMLHttpRequest和FileReader whyle设置自定义内容类型和边界上载二进制文件
我正在尝试使用XMLHttpRequest和FileReader将(DICOM)二进制文件上载到服务器 根据DICOM标准,内容类型muss应Javascript 使用XMLHttpRequest和FileReader whyle设置自定义内容类型和边界上载二进制文件,javascript,ajax,xmlhttprequest,filereader,Javascript,Ajax,Xmlhttprequest,Filereader,我正在尝试使用XMLHttpRequest和FileReader将(DICOM)二进制文件上载到服务器 根据DICOM标准,内容类型muss应多部分/相关;type=application/dicom已定义,并且请求负载中必须是内容类型:application/dicom同样,我已设法用以下代码构建该结构: let boundary = Math.random().toString().substr(2); let reader = new FileReader(); r
多部分/相关;type=application/dicom
已定义,并且请求负载中必须是内容类型:application/dicom
同样,我已设法用以下代码构建该结构:
let boundary = Math.random().toString().substr(2);
let reader = new FileReader();
reader.readAsBinaryString(fileList[0]);
reader.onload = function(e) {
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open("POST", "myurl", true);
var dashes = '--';
var crlf = "\r\n";
if ( fileList[0].type == '' ){
filetype = 'application/dicom';
} else {
filetype = fileList[0].type;
}
let content = e.target["result"];
var data = dashes + boundary + crlf + "Content-Type: " + filetype + crlf + crlf + content + crlf + dashes + boundary + dashes;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/related;type=application/dicom;boundary=" + boundary+";");
xmlHttpRequest.setRequestHeader("Accept", "application/dicom+json");
xmlHttpRequest.send(data);
}; xmlHttpRequest.send(data);
};
这种方法的问题在于,XMLHttpRequest似乎进行了UTF-8编码,这破坏了二进制数据(见下文)
- 问题是如何使用reader.readAsArrayBuffer()并设置正文内容类型和边界?或
- 如何防止XMLHttpRequest进行UTF-8编码
var boundary = Math.random().toString().substr(2);
var reader = new FileReader();
reader.readAsArrayBuffer(fileList[0]);
reader.onload = function(e) {
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open("POST", "myurl", true);
var dashes = '--';
var crlf = "\r\n";
if ( fileList[0].type == '' ){
filetype = 'application/dicom';
} else {
filetype = fileList[0].type;
}
var content = e.target["result"];
var dataView = new DataView(e.target["result"]);
var postDataStart = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + encodeURIComponent(fileList[0].name) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf;
var postDataEnd = crlf + dashes + boundary + dashes;
var size = postDataStart.length + dataView.byteLength + postDataEnd.length;
var uint8Array = new Uint8Array(size);
var i = 0;
for (; i < postDataStart.length; i++) {
uint8Array[i] = postDataStart.charCodeAt(i) & 0xFF;
}
for (let j = 0; j < dataView.byteLength; i++, j++) {
uint8Array[i] = dataView.getUint8(j);
}
for (let j = 0; j < postDataEnd.length; i++, j++) {
uint8Array[i] = postDataEnd.charCodeAt(j) & 0xFF;
}
var payload = uint8Array.buffer;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/related;type=application/dicom;boundary=" + boundary+";");
xmlHttpRequest.setRequestHeader("Accept", "application/dicom+json");
xmlHttpRequest.send(payload);
};
var boundary = Math.random().toString().substr(2);
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open("POST", "myurl", true);
var dashes = '--';
var crlf = "\r\n";
filetype = fileList[0].type;
var postDataStart = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + encodeURIComponent(fileList[0].name) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf;
var postDataEnd = crlf + dashes + boundary + dashes;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/related;type=application/dicom;boundary=" + boundary+";");
xmlHttpRequest.setRequestHeader("Accept", "application/dicom+json");
xmlHttpRequest.send(new Blob([new Blob([postDataStart]),fileList[0], new Blob([postDataEnd])]));