2011-08-31 5 views
6

XMLHttpRequestを使用して、JavaScriptの画像のデータを取得しようとしています。overrideMimeTypeを使用せずにXMLHttpRequestを使用してバイナリデータをダウンロードする

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://www.celticfc.net/images/doc/celticcrest.png"); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4) { 
     var resp = xhr.responseText; 
     console.log(resp.charCodeAt(0) & 0xff); 
    } 
}; 
xhr.send(); 

このデータの最初のバイトは0x89なければならない、しかし、任意の高い値のバイトは、(0xfffd & 0xff0xfdある)0xfffdとして返します。

this oneのような質問は、overrideMimeType()機能を使用したソリューションを提供していますが、私が使用しているプラ​​ットフォーム(Qt/QML)ではサポートされていません。

データを正しくダウンロードするにはどうすればよいですか?

+1

base64エンコードを試しましたか? – cvsguimaraes

+0

どのように私はそれを試みるだろうか? – funkybro

+0

これは不可能です。代わりにQt/C++を使ってネイティブにダウンロードします。 – funkybro

答えて

5

Google I/O 2011: HTML5 Showcase for Web Developers: The Wow and the How

バイナリファイル取得:私はQtのに慣れていないよしかし、私は彼らのdocumentation

string Qt::btoa (data) 
Binary to ASCII - this function returns a base64 encoding of data. 

でこれを見つけ、自分のイメージと、新しい辛さ

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://www.celticfc.net/images/doc/celticcrest.png', true); 

xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
     var uInt8Array = new Uint8Array(this.response); // Note:not xhr.responseText 

     for (var i = 0, len = uInt8Array.length; i < len; ++i) { 
      uInt8Array[i] = this.response[i]; 
     } 

     var byte3 = uInt8Array[4]; // byte at offset 4 
    } 
} 

xhr.send(); 
+3

私のために働いていない、 'xhr.response'は未定義です。 – funkybro

+0

私はあなたにそのリンクを投稿するための無料のビールを提供したいと思います –

+0

将来の読者のための注意:arraybufferをresponseTypeとして使用すると、chromeはonprogressイベントのxhr.response属性を設定しません。したがって、このappraochはchromeの下でのプログレッシブダウンロード/アップロードには役に立たない。 – yms

0

を試してみることができるPNGです:

resp = "data:image/png;base64," + btoa(resp); 
document.write("<img src=\""+resp+"\">"); 
+0

文字列から正しいバイト値にアクセスできない場合、どのように動作するかわかりません。 – funkybro

+0

ちょうど0から始まります!レイアウトエンジンは、イメージのリダリングには関係のないものは常に無視します。 – cvsguimaraes

関連する問題