2

我正在編寫一個用戶腳本來從頁面中獲取圖像,並將其上傳到服務器。 該腳本在FF(Greasemonkey和Scriptish)中正常工作,但是當我使用Chrome(使用Tampermonkey或Ninjakit)時,它不會發送數據,而是發送字符串* [object Object] *。使用GM_xmlhttpRequest在Chrome上POST數據?

這裏是我的腳本:

// ==UserScript== 
// @id    myid 
// @name   myname 
// @version  1.0 
// @namespace  ohadcn 
// @author   Ohad Cohen 
// @description mydescription 
// @include  https://* 
// @grant   GM_xmlhttpRequest 
// @require  https://code.jquery.com/jquery-2.0.3.min.js 
// @run-at   document-end 
// ==/UserScript== 

function getBase64Image(img) { 
    var canvas = document.createElement("canvas"); 
    canvas.width = img.width; 
    canvas.height = img.height; 
    var ctx = canvas.getContext("2d"); 
    ctx.drawImage(img, 0, 0); 
    var dataURL = canvas.toDataURL("image/png"); 
    return dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 
} 

img=$("img[alt=myImage]").get(0); 

img.onload=function(){ 
    var img64=getBase64Image(img) 
    var _data=new FormData(); 
    _data.append("image64",img64); 

    GM_xmlhttpRequest({ 
    method: "POST", 
    url: "http://myserver.org/mysscript.py", 
    headers: { 
    "Content-Type": "multipart/form-data" 
    }, 
    data:_data, 
    onload: function(response) { 
      console.log ("gut response"); 
     $("#input").get()[0].value=response.responseText; 
    } 
    }); 
} 


兩個Tampermonkey和Ninjakit不要發送請求。在Tampermonkey中,我得到了一個迴應,在Ninjakit中我沒有(onload永遠不會被調用)。

但他們不會發送用base64編碼的實際圖像 - 當我讀取數據時 - 服務器獲取[對象對象]作爲POST正文(而不是數據正文,我無法獲取devtools網絡面板顯示由GM_xmlhttpRequest發出的請求,所以我在服務器端檢查了它)。

回答

3

可能FormDatamultipart/form-data在這些平臺上得不到很好的支持。需要更多地研究它(稍後)。

同時,嘗試更典型的方法;使用application/x-www-form-urlencoded或JSON。

EG:

GM_xmlhttpRequest ({ 
    method:  "POST", 
    url:  "http://myserver.org/mysscript.py", 
    data:  "image64=" + encodeURIComponent (img64), 
    headers: { 
     "Content-Type": "application/x-www-form-urlencoded" 
    }, 
    onload:  function (response) { 
     console.log ("gut response"); 
     $("#input").get()[0].value=response.responseText; 
    } 
}); 
+0

它看起來像改變的內容類型沒有任何影響。 將圖像直接放在數據字段中可以起到簡單的解決方法的作用,但一般情況下的問題仍然存在。 我將此標記爲已解決,即使我認爲問題仍在此處,也許chrome/tampermonkey背後的人需要處理它。 –