Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用XMLHttpRequest和FileReader whyle设置自定义内容类型和边界上载二进制文件_Javascript_Ajax_Xmlhttprequest_Filereader - Fatal编程技术网

Javascript 使用XMLHttpRequest和FileReader whyle设置自定义内容类型和边界上载二进制文件

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

我正在尝试使用XMLHttpRequest和FileReader将(DICOM)二进制文件上载到服务器

根据DICOM标准,内容类型muss应
多部分/相关;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编码
我的第二个问题是如何使用这种方法处理大文件(约1 TB)?

我找到了我(第一部分)问题的答案。多亏了这一点,现在我的代码是:

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])]));