2012-08-13 53 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