2012-12-06 41 views
1

我需要將客戶第三方網站的文件(.zip)傳輸到我的。使用Greasemonkey和PHP下載並上傳

GM-片段(註釋等改掉)

GM_xmlhttpRequest({ 
    method: "GET", 
    url: dlurl, 
    timeout:0, 
    onload: function(resp) { 
    var conti=resp.responseText; 

alert("goup"); 
GM_xmlhttpRequest({ 
    method: "POST", 
    url: "http://absolut-fair.com/wbb_back/api.php?id=3", 
    overrideMimeType: 'text/plain; charset=x-user-defined', 
    data:"chk=1&data="+base64_encode(conti), 
    headers: { 
      "Content-Type": "application/x-www-form-urlencoded" 
    }, 
    onload: function(resp) { 
     var conti=resp.responseText; 

     if(conti=="1") alert("upload erfolgreich"); 
     else alert(conti); 
//.... 

PHP-片段

$name="test.txt"; 
uploadfile(base64_decode($_POST["data"]),detect_mime($name),$name); 

問題

所有解碼的文件已損壞時,我嘗試打開它們。 問題是發送二進制數據。發送原始文本工作正常!

//更新

我剛剛下載的健康和無效的zip文件,它似乎是無效的一個處理大量的空間填充無用的代碼段。 所以我覺得base64不能完全編碼/解碼二進制數據。任何人有任何知識?

我附上了一個源代碼的截圖,使其清晰!

有效文件:

the valid file

無效之一:

the invalid one

+0

_POST數據有一個大小限制。你應該做的就是上傳文件,像普通的HTTP上傳,然後使用_FILES – Michael

+0

在php中訪問文件。詢問前請查看問題和支持的代碼。 //編輯:我不能自動通過JS/GM下載文件,否則我已經這樣做了。 –

+1

我在說的是POST數據保存在網絡服務器上的內存中,直到收到整個請求,而文件上傳(multipart/form-data)通常緩存到磁盤。您當前的代碼適用於較小的文件,但對於較大的文件,它可能會耗盡內存或超出請求限制。 – Michael

回答

1

,因爲我是不是能夠得到幫助在這裏,我問命名有經驗的用戶「Kugelfisch23」在德國社區「gulli」尋求幫助並給他發了這個話題。

現在我們解決了我想爲其他用戶提供更多信息的問題,這些用戶試圖通過Greasemonkey發送二進制文件並使用PHP接收它。

如果您也在的某種工作,我建議首先發送一個小示例文件,如this,因爲它包含所有的二進制字符。 因此,您將能夠檢查問題發生的位置,如果可能的話,最有可能的編碼/解碼出錯了。


1日問題:接收二進制數據

正如你可以在我在開始的時候例子中看到的,我改寫的MIME類型時SENDING二進制數據,而不是在接收時。因此,對象responseText只包含UTF-8字符並破壞數據。 =>接收時也需要覆蓋MIME類型。

GM_xmlhttpRequest({ 
    method: "GET", 
    url: dlurl, 
    timeout:0, 
    overrideMimeType: 'text/plain; charset=x-user-defined', 
    //... 

第二個問題:二進制數據編碼爲Base64

正如它不可能簡單地發送二進制數據作爲POST參數,需要對數據進行編碼,使之sendeable。 在我使用的第一個trys this base64_encode - 函數來編碼我的數據。 正如我後來發現的,這個函數只提供了不足的轉換來發送二進制數據,應該主要用於編碼文本。 This function(參考功能base64Encode(str),不要將它與base64ArrayBuffer混淆),而是能夠編碼二進制數據。

3問題:發送的base64

在發送後base64編碼的結果是不夠的,因爲它含有大量的PHP-端點不能處理或轉換爲無效字符的字符。 在發送它之前在base64結果上使用encodeURIComponent

第四問題:接收和解碼

即使它是相當簡單的輸入數據進行解碼,我會爲你提供我的片段。

if(empty($_POST["data"])) die("no data sent"); 
$name="test.zip"; 
$binary=base64_decode($_POST["data"]); 

結果

的Greasemonkey/JS

 var dlurl = "http://website.zip"; 
     GM_xmlhttpRequest({ 
      method: "GET", 
      url: dlurl, 
      overrideMimeType: 'text/plain; charset=x-user-defined', 
      timeout:0, 
      onload: function(resp) { 
       var conti=resp.responseText; 
       var encoded = encodeURIComponent(base64Encode(conti)); 
       GM_xmlhttpRequest({ 
        method: "POST", 
        url: "http://absolut-fair.com/wbb_back/api.php?id=3", 
        overrideMimeType: 'text/plain; charset=x-user-defined', 
        data:"data="+encoded, 
        headers: { 
          "Content-Type": "application/x-www-form-urlencoded" 
         }, 
        onload: function(resp) { 
        //... 

PHP

第四屆問題

見代碼0