gpt4 book ai didi

javascript - 如何使用 Javascript 和 XMLHttpRequest 加载二进制图像数据?

转载 作者:行者123 更新时间:2023-12-03 02:11:02 24 4
gpt4 key购买 nike

我试图加载图像客户端并对服务器返回的字节进行 Base64 编码,以便将其传递出去以执行某些处理。 IE有XMLHttpRequest对象的RequestBody属性,但我似乎无法使用它,并且RequestText被 chop 。在 Firefox 中,RequestText 存在,但似乎已损坏。

最佳答案

我是这样做的。

此技术是在另一个 SO 问题的答案中提供的,但它在这里也相关。

我不想对任何内容进行 Base64 编码。我想通过Javascript在浏览器中下载并解析二进制文件,而不需要修改服务器来对其进行专门编码。我发现在 Firefox 中,通过 overrideMimeType() 强制响应的 mimetype,我可以使用 XMLHttpRequest.responseText。在 IE 上,情况有所不同,因为:

    IE 上的
  • responseText 在第一个零处 chop 。对于二进制流来说这是一个大问题。

  • 没有 XMLHttpRequest.overrideMimeType() 来强制 IE 将二进制流视为文本。

  • 虽然有一个专门设计用于二进制数据流的 XMLHttpRequest.responseBody(仅限 IE!),但令人抓狂的是,该属性无法在 Javascript 中使用。

因此,需要将 IE 的 responseBody 属性转换为类似于 FireFox 的 responseText 的东西,并进行 mime 类型强制转换。使用注入(inject)的 VBScript 可以实现这一点。

要使其跨浏览器,您只需将浏览器特定的逻辑打包在条件中即可。这是我使用的:

// one-time code
if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
var IEBinaryToArray_ByteStr_Script =
"<!-- IEBinaryToArray_ByteStr -->\r\n"+
"<script type='text/vbscript'>\r\n"+
"Function IEBinaryToArray_ByteStr(Binary)\r\n"+
" IEBinaryToArray_ByteStr = CStr(Binary)\r\n"+
"End Function\r\n"+
"Function IEBinaryToArray_ByteStr_Last(Binary)\r\n"+
" Dim lastIndex\r\n"+
" lastIndex = LenB(Binary)\r\n"+
" if lastIndex mod 2 Then\r\n"+
" IEBinaryToArray_ByteStr_Last = Chr( AscB( MidB( Binary, lastIndex, 1 ) ) )\r\n"+
" Else\r\n"+
" IEBinaryToArray_ByteStr_Last = "+'""'+"\r\n"+
" End If\r\n"+
"End Function\r\n"+
"</script>\r\n";

// inject VBScript
document.write(IEBinaryToArray_ByteStr_Script);
}


// each time you make a request for a binary resource:
var req = (function() {
if (window.XMLHttpRequest) {
return new window.XMLHttpRequest();
}
else {
try {
return new ActiveXObject("MSXML2.XMLHTTP");
}
catch(ex) {
return null;
}
}
})();

var fileContents = "";
var filesize = -1;
var readByteAt = function(i){
return fileContents.charCodeAt(i) & 0xff;
};

req.open("GET", url, true);

if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
// IE-specific logic here
// helper to convert from responseBody to a "responseText" like thing
var convertResponseBodyToText = function (binary) {
var byteMapping = {};
for ( var i = 0; i < 256; i++ ) {
for ( var j = 0; j < 256; j++ ) {
byteMapping[ String.fromCharCode( i + j * 256 ) ] =
String.fromCharCode(i) + String.fromCharCode(j);
}
}
var rawBytes = IEBinaryToArray_ByteStr(binary);
var lastChr = IEBinaryToArray_ByteStr_Last(binary);
return rawBytes.replace(/[\s\S]/g,
function( match ) { return byteMapping[match]; }) + lastChr;
};

req.setRequestHeader("Accept-Charset", "x-user-defined");
req.onreadystatechange = function(event){
if (req.readyState == 4) {
if (req.status == 200) {
fileContents = convertResponseBodyToText(req.responseBody);
fileSize = fileContents.length-1;
// invoke a callback here, if you like...
}
else{
alert("download failed, status " + req.status);
}
}
};
req.send();

} else {
// ff/Gecko/Webkit specific stuff here
req.onreadystatechange = function(aEvt) {
if (req.readyState == 4) { // completed
if(req.status == 200){ // status == OK
fileContents = binStream.req.responseText;
filesize = fileContents.length;
// invoke a callback here, if you like...
}
else {
alert("download failed, status " + req.status);
}
}
};
// coerce response type
req.overrideMimeType('text/plain; charset=x-user-defined');
req.send(null);
}

...然后调用readByte(i)来获取二进制文件中第i位置的字节。

祝你好运。

Credit to Miskun用于 VBScript 转换逻辑。

关于javascript - 如何使用 Javascript 和 XMLHttpRequest 加载二进制图像数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com