2011-08-10 33 views
2

我試圖寫一個Safari瀏覽器插件,以搶在用戶打開PDF文檔,然後將其提交到通過POST另一個站點。的Javascript在Safari插件 - 從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); 
     } 

產生的POST會談我的PHP腳本,並在其$ _FILES數組是我的文件。完善。

但絕對沒有我嘗試似乎使用Safari工作。我嘗試responseType='blob'開始,但沒有奏效。我無法使用任何Safari JS文件對象來處理這些數據。我試圖將其更改爲一個UINT8數組但這絲毫不提交數據,只是串說"[object UInt8Array]"

任何想法?

乾杯! 託尼

回答

2

我保持的responseType爲「arraybuffer」偉大的結果,然後通過xhr.response到一個新的Uint8Array的構造在Safari 5.1.1工作完全在我的Mac:

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模式啓動之前,我嘗試了一兩個事情,並且我發現MDN page on XMLHttpRequest有讀取二進制數據的一節(MDN是一個很好的資源)。

一旦我把到位,一切都開始飛馳工作。

+0

你真的讓Safari上傳二進制數據嗎?添加一個'ArrayBuffer'到'FormData'對象導致其提交一個畸形多形式,所以服務器'------ WebKitFormBoundaryaiKF2ZGx25JiZdKY報告整個文件的內容 - '。但是,其他任何嘗試都沒有發生,Safari已悄悄發送任何信息。 – Potatoswatter

相關問題