2013-09-23 11 views
6

私は現在、バイナリデータで部分的なXHR応答を読む可能性を研究しています。現在のアプローチは、 'responseText'プロパティとbase64エンコーディングに基づいています。明らかに、これは最適ではありません。バイナリデータの部分的なXHR応答の読み取りは可能ですか?

XHRを使用して部分的なBlob/ArrayBuffer応答を読み取るにはどうすればよいですか? Chromeで試してみると、readyState = 4でArrayBuffer/Blob全体が使用可能になりますが、その前には使用できません。応答が= 4 readyStateの前に読み取ることができ、我々は戻って、クライアント

  • 読書XHRのにbase64でエンコードされたバイナリデータをストリームすることができます。

    • 読書XHRのresponseTextプロパティ:要約する

      、ように私には思えますresponseType = 'arraybuffer'のレスポンス・プロパティ:レスポンス・タイプはありませんが、readyState = 4のときにバッファ全体が使用可能になります。

    ここに何か不足していますか?部分的なバイナリ応答を読み取るには、どのようなアプローチが必要ですか?

  • 答えて

    3

    the fetch API(現在supported by Firefox and Chrome)を目にしてください。

    +0

    ありがとう!それはそれを行う方法のように見えます。追加の利点として、私たちの場合、サポートされていないブラウザに対して標準のXHR要求を簡単に使用できます。 – bjornl

    5

    まだ標準ではありませんが、方法があります。 FirefoxではXHRのresponseTypeを "moz-blob"、 "moz-chunked-text"、または "moz-chunked-arraybuffer"に設定することができます。次に、progressイベントを聞くと、入ってくる部分データにアクセスできるようになります。MDNにはherehereという詳細情報があります。

    クロムはStreams APIをサポートしますが、それはnot ready yetです。 Firefoxはeventuallyもサポートしています。私はIEがすでに行っているところを読んでいますが、それを確認するための正式な文書は見つけられないようです。

    +0

    返信いただきありがとうございます。私たちはすでにストリーミング/チャンク機構を実装しています。これはbase64エンコーディングとresponseType = textに基づいています。これは今日最も広くサポートされているソリューションだと思われます。 – bjornl

    +0

    私たちのアプローチを、バイナリ多重化されたWebSocket通信に依存する方法に切り替えることができます。独自のプロトコルに従って、チャンクされています。チャンクは、効率的な多重化を可能にするだけでなく、断線を確実に検出できるように、かなり小さく、予測可能なサイズでなければならない。今のところ実行可能な選択肢と思われる。 – bjornl

    +0

    ええ、WebSocketは、サーバーを持っていると仮定すると、別の良いオプションです。 – brianchirls

    1

    XHRの代替として使用する最適なAPIは、readableStreamでフェッチします。

    これは、ここで説明されています https://developers.google.com/web/fundamentals/primers/async-functions#example_streaming_a_response

    Chromeはすでにそれをサポートしています。 Firefoxはこれを実装していますが、手動で有効にする必要があります(将来のバージョンではデフォルトで有効になります)。 Firefoxは、非標準応答タイプのmoz-chunked-arraybufferを持つXHRを実装しています

    ライブラリhttps://www.npmjs.com/package/fetch-readablestreamは、これら2つの方法を実装するAPIを提案しています。それはhttps://www.npmjs.com/package/web-streams-polyfillを使用します。

    関連する問題