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背后的人需要处理它。 –