2012-08-13 20 views
0

我正在尝试读取与MyFile.html处于相同域的二进制文件MyFile.xxx。使用JQuery我试图用MyFile.xxx中的字符数显示一个警报,并打印每个警报的数字表示。不过,我得到根据浏览器不同的结果:与JQuery阅读二进制文件的浏览器之间的不同行为

谷歌浏览器:我得到正确显示33警报,并正确的整数 火狐:警报显示“未定义”,并没有整数打印。 IE9:警报显示“1”,不打印整数。

任何想法?由于

MyFile.html

<html>                 
<head>                 
<script type="text/javascript" src="jquery.js"></script>   
<script type="text/javascript">           
    $.get('/MyFile.xxx', function(a){ 
    var l=a.length,x=[l]; 
    alert(l); 
    for(i=0;i<l;i++){ 
     x[i]=a[i].charCodeAt(0); 
     document.write(x[i]); 
     document.write("<br>"); 
    }  
});        
</script>                
</head>                 
<body>                 
</body>                 
</html> 
+0

请显示内容。 – mplungjan 2012-08-13 10:41:26

回答

1

试试这个:

$.ajax("/MyFile.xxx", { 
    dataType: "text", 
    beforeSend: function(xhr) { 
     xhr.overrideMimeType("text/plain; charset=x-user-defined"); 
    }, 

    success: function(data) { 
     var len = data.length, 
      str = ""; 

     for(var i = 0; i < len; ++i) { 
      var byte = data.charCodeAt(i) & 0xFF; 
      str += byte + " "; 

     } 
     document.body.innerHTML = str; 
    } 
}); 

演示:http://jsfiddle.net/SXgfu/(显示UTF-8字节åöä

注意,IE9不支持这个。它不支持获取响应的原始字节的任何其他方式。

如果您使用的是PHP,你可以使用这个变通的IE:

$.get("/base64encoder.php?file=MyFile.xxx", function(data) { 
    data = decode64(data); 
    var len = data.length, 
     str = ""; 
    for (var i = 0; i < len; ++i) { 
     var byte = data.charCodeAt(i) & 0xFF; 
     str += byte + " "; 
    } 
    document.body.innerHTML = str; 
}, "text"); 

凡​​是一样的东西:

<?php 
echo base64_encode(file_get_contents($_GET['file'])); 

记得消毒以上,否则就巨大的安全漏洞

and decode64(src http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html):

var keyStr = "ABCDEFGHIJKLMNOP" + 
      "QRSTUVWXYZabcdef" + 
      "ghijklmnopqrstuv" + 
      "wxyz/" + 
      "="; 

function decode64(input) { 
    var output = ""; 
    var chr1, chr2, chr3 = ""; 
    var enc1, enc2, enc3, enc4 = ""; 
    var i = 0; 
    // remove all characters that are not A-Z, a-z, 0-9, +, /, or = 
    var base64test = /[^A-Za-z0-9\+\/\=]/g; 
    if (base64test.exec(input)) { 
     alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding."); 
    } 
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 
    do { 
     enc1 = keyStr.indexOf(input.charAt(i++)); 
     enc2 = keyStr.indexOf(input.charAt(i++)); 
     enc3 = keyStr.indexOf(input.charAt(i++)); 
     enc4 = keyStr.indexOf(input.charAt(i++)); 
     chr1 = (enc1 << 2) | (enc2 >> 4); 
     chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
     chr3 = ((enc3 & 3) << 6) | enc4; 
     output = output + String.fromCharCode(chr1); 
     if (enc3 != 64) { 
      output = output + String.fromCharCode(chr2); 
     } 
     if (enc4 != 64) { 
      output = output + String.fromCharCode(chr3); 
     } 
     chr1 = chr2 = chr3 = ""; 
     enc1 = enc2 = enc3 = enc4 = ""; 
    } while (i < input.length); 
    return output; 
} 
+0

谢谢!您的解决方案适用于Chrome和Firefox,但正如您所说,它不适用于IE9。你的意思是不可能从Internet Explorer读取二进制文件?谢谢 – Arturo 2012-08-13 11:31:23

+1

@Arturo是的。你必须使用解决方法,比如发送二进制文件作为base64,并在客户机上解码。 – Esailija 2012-08-13 11:32:09

+0

当我说二进制文件时,我的意思是“无文本”文件,但我相信您的评论仍然适用。谢谢。如果你有一个关于base64编码的链接,那就太棒了。 – Arturo 2012-08-13 11:37:35