2

페이지에서 이미지를 가져 와서 서버에 업로드하는 사용자 스크립트를 작성하고 있습니다. FF (Greasemonkey 및 Scriptish)에서는 스크립트가 정상적으로 작동하지만 Tampermonkey 또는 Ninjakit을 사용하여 Chrome을 사용하면 데이터를 보내지 않고 * [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로 인코딩 된 실제 이미지를 보내지 않습니다. 서버가 [object Object]을 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

는 효과가 없습니다. 이미지를 데이터 필드에 직접 넣는 것은 간단한 해결 방법으로 작동하지만 일반적인 경우에 대한 질문은 여기에 있습니다. 나는 이것을 해결 된 것으로 표시한다. 심지어 질문이 여전히 여기에 있다고 생각한다. 아마도 크롬/tampermonkey 뒤에있는 사람들이 그것에 대해 연구해야 할 것이다. –