我收到ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_RESET错误,具体取决于我选择使用JQuery Ajax函数上传的图像。
图像数据将转换为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字符串代码的示例:
根据我要上传的图像,我会遇到以下任一错误:
net :: ERR_SPDY_PROTOCOL_ERROR
我还增加了IIS的最大上传大小: Ajax not post base64 data of large image