2012-12-10 12 views
11

XMLHttpRequestを使用してバイナリ形式でjpegイメージをロードしています(そのようにする必要があります)。これはbase64でエンコードされていません。バイナリイメージがサーバからイメージにロードされ、javacriptで表示されます

javascriptを使用してimgオブジェクトにすることはできますか?

おかげXMLHttpRequestの文字エンコーディングがsomething that won't change the binary dataに設定されている、またはあなたがset the response typeてきた、あなたはその後、btoa(BASE64でそれを入れて、あなたがデータURIとして割り当てるせること)を介して.responseTextを実行できる場合

答えて

4

バイナリデータの場合はそれぞれ.responseにアクセスしてください。

あなたのインスタンスは xhrという名前で、あなたが xhr.send前に、文字セットの方法を使用しているが、あなたはどのあなたができる 200 OK

var dataURI = 'data:image/jpeg;base64,' + btoa(xhr.responseText); 

いるときxhr.open後、その後

xhr.overrideMimeType("text/plain; charset=x-user-defined"); 

を行うと仮定すると、


<img>に設定します。再びxhrを想定


、今回.response方法。 .open.send間、

xhr.responseType = "arraybuffer"; 

次にあなたが<img>SRCとして設定することができます200 OK

var arrayBufferView = new Uint8Array(xhr.response), // can choose 8, 16 or 32 depending on how you save your images 
    blob = new Blob([arrayBufferView], {'type': 'image\/jpeg'}), 
    objectURL = window.URL.createObjectURL(blob); 

で。 Example

+0

これはインラインイメージと呼ばれます。 IE8は32KB未満のインラインイメージしかサポートしていないことに注意してください(ベース64エンコードデータの場合、ソースイメージは24KB未満でなければなりません)。IE7以前はインラインイメージを全くサポートしていません)。 –

+0

それを試しましたが、 'btoa(xhr.responseText)'は 'Error:INVALID_CHARACTER_ERR:DOM Exception 5'を返し続けます。なぜこれが起こるのか分かりません。 IE7/IE8の場合...私はそれに対処するためにFlashオブジェクトを作成しなければならないでしょう – Marc

+0

@Marcなぜなら 'btoa'にはいくつかの[バグ]があるからです(https://bugzilla.mozilla.org/show_bug.cgi? id = 213047)(同じ/同様のことがウェブキットにも当てはまります)、_ArrayBuffer_ - > 'Blob' - > _URL.createObjectURL_メソッドを使って答えを更新します。これは私の意見では_FileReader_よりも少し良いですが、 _btoa_として –

関連する問題