2011-08-10 12 views
2

ユーザーが開いているPDFドキュメントを取得してPOST経由で別のサイトに送信するSafari拡張機能を作成しようとしています。SafariプラグインのJavascript - XHRからバイナリファイルのデータをダウンロードしてから再送信する

私はChromeでこの作業を行っていますが、SafariはBlobBuilderで動作しないため、同じ方法をコピーしても機能しません。

これは、Chromeでどのような作品です:

var xhr = new XMLHttpRequest(); 
    xhr.open("GET", tab.url, true); 

    xhr.responseType = "arraybuffer"; 

    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4 && xhr.status == 200) { 

      var bb = new BlobBuilder(); 
      bb.append(this.response); 

      var blob = bb.getBlob('application/pdf'); 

      var http = new XMLHttpRequest(); 

      http.open("POST", send_url, true); 

      var formData = new FormData(); 
      formData.append("src", blob); 
      http.send(formData); 
     } 

私のPHPスクリプトへとその$ _FILES配列の結果POST会談が私のファイルです。完璧。

しかし、私が試したことは絶対に何もSafariを使用して動作しているようです。私はresponseType='blob'を試してみましたが、うまくいきませんでした。 Safari JSファイルオブジェクトをこのデータで処理することはできません。私はそれをUint8配列に変更しようとしましたが、これはデータを提出しませんでした。ただの文字列"[object UInt8Array]"

アイデアはありますか?

乾杯!私は素晴らしい結果が「arraybuffer」としてresponseTypeを維持し、新しいUint8Arrayのコンストラクタにxhr.responseを渡しました トニー

答えて

2

は、私のMac上のSafari 5.1.1で完全に働いた:

xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     buffer = new Uint8Array(xhr.response); 
     for (var loop=0; loop<buffer.length; loop++) { 
      // Do something with buffer[loop] 
     } 
    } 
} 
xhr.open('GET', 'yourfilename.here', true); 
xhr.responseType = 'arraybuffer'; 
xhr.send(); 

を私は認めなければなりませんRTFMモードが始動する前に「1つか2つ」のものを試してみたところ、MDN page on XMLHttpRequestにバイナリデータを読むセクションがあることがわかりました(MDNは素晴らしいリソースです)。

私がそれをいったん組み込むと、すべてがうまくいっています。

Dan

+0

バイナリデータをアップロードするには本当にSafariを取得しましたか? 'FormData'オブジェクトに' ArrayBuffer'を追加すると、不正な形式のマルチパートフォームが送信されるので、サーバはファイル内容全体を '------ WebKitFormBoundaryaiKF2ZGx25JiZdKY - 'として報告します。しかしそれは、Safariが静かに何も送っていない他の試みで起こったこと以上のものです。 – Potatoswatter

関連する問題