IE中原生的base64支援

來源:互聯網
上載者:User
 var dom = {};    dom.base64encode = function (data) {      var xml_dom = new ActiveXObject("Microsoft.XMLDOM");      xml_dom.loadXML('');      xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");      var node1 = xml_dom.createElement("file1");      node1.dataType = "bin.base64";      node1.nodeTypedValue=data;      xml_dom.documentElement.appendChild(node1);      return node1.text;    }    var fso = new ActiveXObject('Scripting.FileSystemObject');    var stream = new ActiveXObject('ADODB.Stream');    stream.Type=1;//1=binary,2=text    stream.Open();    stream.LoadFromFile(fso.GetAbsolutePathName("/images/rails.png"));    var bin = stream.Read(-1);//-1:read all , -2 : read line    var ret = dom.base64encode(bin);    

上述代碼需要把瀏覽器的安全層級放到最低,可能還要做其他設定才行。不過,後來我發現更好的讀入資料流的方法,畢竟Scripting.FileSystemObject太不可靠,我們需要一個更常用的宿主對象。IE的AJAX實現無疑是最好的選擇。

    var http = new ActiveXObject("Microsoft.XmlHttp");    http.open("GET", "images/default/logo.gif", false);    http.send();    var xml = document.createElement("xml");    xml.loadXML("");    var root = xml.documentElement;    root.dataType = "bin.base64";    root.nodeTypedValue = http.responseBody;    alert(root.text);

在能支援HTML5 的新銳遊覽器,它們擁有一個叫toDataURL的API可以實現這種二進位轉換為base64的功能。

如果是字串轉換編碼則簡單多了,firefox擁有兩個叫atob與btoa的方法,詳見這裡。

最後附上日本一JS高手的相容方案:

/* * $Id: base64.js,v 1.1 2009/03/01 22:38:45 dankogai Exp dankogai $ * * History: *   dankogai's original: character-based *   drry's fix: split string to array then join *   new version: regexp-based */(function(){var b64chars     = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var b64tab = function(bin){    var t = {};    for (var i = 0, l = bin.length; i >> 18)         + b64chars.charAt((n >>> 12) & 63)         + b64chars.charAt((n >>>  6) & 63)         + b64chars.charAt( n         & 63);};var toBase64 = function(bin){    if (bin.match(/[^\x00-\xFF]/)) throw 'unsupported character found' ;    var padlen = 0;    while(bin.length % 3) {        bin += '\0';        padlen++;    };    var b64 = bin.replace(/[\x00-\xFF]{3}/g, sub_toBase64);    if (!padlen) return b64;    b64 = b64.substr(0, b64.length - padlen);    while(padlen--) b64 += '=';    return b64;};var btoa = window.btoa || toBase64;var sub_fromBase64 = function(m){        var n = (b64tab[ m.charAt(0) ] > 16 )        +  String.fromCharCode( (n >>  8) & 0xff )        +  String.fromCharCode(  n        & 0xff );};var fromBase64 = function(b64){    b64 = b64.replace(/[^A-Za-z0-9\+\/]/g, '');    var padlen = 0;    while(b64.length % 4){        b64 += 'A';        padlen++;    }    var bin = b64.replace(/[A-Za-z0-9\+\/]{4}/g, sub_fromBase64);    bin.length -= [0,0,2,1][padlen];    return bin;};var atob = window.atob || fromBase64;var re_char_nonascii = /[^\x00-\xFF]/g;var sub_char_nonascii = function(m){    var n = m.charCodeAt(0);    return n >>  6))                     + String.fromCharCode(0x80 | (n & 0x3f))        :              String.fromCharCode(0xe0 | ((n >>> 12) & 0x0f))                     + String.fromCharCode(0x80 | ((n >>>  6) & 0x3f))                     + String.fromCharCode(0x80 |  (n         & 0x3f))        ;};var utob = function(uni){    return uni.replace(re_char_nonascii, sub_char_nonascii);};var re_bytes_nonascii    = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;var sub_bytes_nonascii = function(m){    var c0 = m.charCodeAt(0);    var c1 = m.charCodeAt(1);    if(c0 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.