上载大文件时,jQuery Ajax返回ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_RESET错误

时间:2019-06-26 14:55:19

标签: jquery ajax base64 connection-reset

我收到ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_RESET错误,具体取决于我选择使用JQuery Ajax函数上传的图像。

enter image description here

图像数据将转换为Base64字符串,并且这些错误仅在上传大文件时发生。我已经用一个小的图像文件对此进行了测试,并且可以正常工作。

有时我还会得到ERR_BLOCKED_BY_CLIENT,这是一个AdBlocker,它正在提取Base64字符串中的代码。 Getting "net::ERR_BLOCKED_BY_CLIENT" error on some AJAX calls

我正在通过Ajax发送图像数据,因为我不能在DotNetNuke中使用SaveAS,因为我调用的方法在DNN模块中的单独控制器类中,并且它丢失了上载控制器对象。

这是将ByteArray转换为Base64字符串的函数:

  function base64ArrayBuffer(arrayBuffer) {
  var base64    = ''
  var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

  var bytes         = new Uint8Array(arrayBuffer)
  var byteLength    = bytes.byteLength
  var byteRemainder = byteLength % 3
  var mainLength    = byteLength - byteRemainder

  var a, b, c, d
  var chunk

  // Main loop deals with bytes in chunks of 3
  for (var i = 0; i < mainLength; i = i + 3) {
    // Combine the three bytes into a single integer
    chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]

    // Use bitmasks to extract 6-bit segments from the triplet
    a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18
    b = (chunk & 258048)   >> 12 // 258048   = (2^6 - 1) << 12
    c = (chunk & 4032)     >>  6 // 4032     = (2^6 - 1) << 6
    d = chunk & 63               // 63       = 2^6 - 1

    // Convert the raw binary segments to the appropriate ASCII encoding
    base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]
  }

  // Deal with the remaining bytes and padding
  if (byteRemainder == 1) {
    chunk = bytes[mainLength]

    a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2

    // Set the 4 least significant bits to zero
    b = (chunk & 3)   << 4 // 3   = 2^2 - 1

    base64 += encodings[a] + encodings[b] + '=='
  } else if (byteRemainder == 2) {
    chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]

    a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10
    b = (chunk & 1008)  >>  4 // 1008  = (2^6 - 1) << 4

    // Set the 2 least significant bits to zero
    c = (chunk & 15)    <<  2 // 15    = 2^4 - 1

    base64 += encodings[a] + encodings[b] + encodings[c] + '='
  }

  return base64
            }

这是将使用JQuery和Ajax函数获取图像字节数据的代码:

$('.upload_btn').on("click", function (e) {
    e.preventDefault();

    if ($("#upload_control")[0].files.length === 0) {
        $.fancybox.open("<div class='nofileselected'><h2>No File Selected</h2><p>No file has been selected to upload.</p></div>");
    } else {
        var Filename = $("#upload_control")[0].files[0].name;
        var Maxuploadsize = "<%=ImageMaximumUploadSize%>";
        var Sizeoffile = $("#upload_control")[0].files[0].size;


        var fileList = document.getElementById("upload_control").files;
        var fileReader = new FileReader();
        if (fileReader && fileList && fileList.length) {
            fileReader.readAsArrayBuffer(fileList[0]);
            fileReader.onload = function () {
                var imageData = fileReader.result;
                var NewData = base64ArrayBuffer(imageData)                    
                uploadImageAjax(NewData);
            };
        }


        function uploadImageAjax(NewData){
            $.ajax({
                type: "POST",
                cache: false,
                processData: false,
                contentType: false,
                async: true,
                contentType: 'application/json',
                url: $.fn.GetBaseURL() + 'DesktopModules/ProductDetailedView/API/Upload/UploadImage?FileName=' + Filename + '&MaxUploadSize=' + Maxuploadsize + '&SizeOfFile=' + Sizeoffile + '&DataFile=' + NewData,
                success: function (data) {
                    alert("Upload Successfull");
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console.log(xhr.responseText);
                }
            });
    }       

    }

});

以下是NewData Base64字符串代码的示例:

enter image description here

根据我要上传的图像,我会遇到以下任一错误:

net :: ERR_BLOCKED_BY_CLIENT enter image description here

net :: ERR_SPDY_PROTOCOL_ERROR enter image description here

net :: ERR_CONNECTION_RESET enter image description here

我还增加了IIS的最大上传大小: Ajax not post base64 data of large image

0 个答案:

没有答案