0

나는 내가 NodeJS와 두를 사용하고 Content-Type: multipart/form-data (http://docs.octoprint.org/en/master/api/fileops.html#upload-file)와 POST 요청비동기 폼 데이터 POST 요청 xmlhhtprequest와

를 전송하여 수행해야합니다 Octoprint의 REST API를에 파일을 업로드하는 것을 시도하고있다 라이브러리, XmlHttpRequest 및 양식 데이터. 하려고 할 때 :

var xhr = new xmlhttprequest() ; 
    var form = new formData() ; 
    form.append('exampleKey', 'exampleValue'); 
    xhr.open("POST","octopi.local/api/local", true) ; 
    xhr.setRequestHeader("Content-Type","multipart/form-data") ; 
    xhr.send(form) ; 

나는 위해 xhr.send 줄에서 오류가 발생합니다 :

TypeError: first argument must be a string or Buffer 

나는 xhr.open 사용하여 동기 요청 한 경우 ("POST"를, URL, false)를이 오류가 사라집니다.

왜 그렇습니까? 그것을 비동기 요청으로 변환하는 방법이 있습니까?

편집 실제로, 나는 설명서를 실제로 이해하지 못합니다. form.append("filename", filepath, "exampleName")을 사용하여 업로드 할 파일을 설정해야한다고 생각하지만 확실치 않습니다. 사실은 파일을 보내지 않고도 단순한 요청을 시도해도 TypeError가 발생한다는 것을 알았습니다.

EDIT2이 같은 오류를 반환 수정 된 코드입니다 : 당신은 당신의 코드에 오타가 있는지

var XMLHttpRequest=require('xmlhttprequest').XMLHttpRequest ; 
    var FormData = require('form-data'); 

    var data = new FormData(); 
    data.append("key","value"); 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', "octopi.local/api/files/"); 
    xhr.send(data); 
+0

업로드 할 파일을 어디에서 설정하고 있습니까? –

+0

'비동기식/동기식 '키가 여기 있다고 생각합니다. POST를 동기식으로 설정하면 콜백 함수 이후의 모든 코드가 콜백이 반환 된 후에 실행됩니다. 반대로 비동기식 모드에서는 콜백 이후 코드가 반환되기 전에 실행됩니다. 따라서 결과가 필요하면 오류 메시지가 표시되지 않습니다. : 원하는 작업을 수행하기 위해 콜백 내에서 다른 콜백을 호출하지 않는 한 방법이 있다고 생각하지 않습니다. –

+0

@VasilDininski : 사실, 설명서를 실제로 이해하지 못합니다. form.append ("filename", filepath, "exampleName")를 사용하여 업로드 할 파일을 설정해야한다고 생각합니다. 그러나 그것에 대해서는 확실하지 않습니다. 사실 나는 어떤 파일도 보내지 않고도 단순한 요청을 시도해도 TypeError가 발생한다는 것을 알게되었습니다. –

답변

1

에 따라 관련 부품을 교체, 나는 마지막으로 파일을 업로드 할 수 있었다. NodeJS를 사용하는 경우 MDN 문서에 의존하지 마십시오. 노드가 실제로 수행 할 수있는 작업이 아니라 라이브러리가 수행해야 할 작업을 알려줍니다. GitHub에서 사용할 수있는 문서에만 집중해야합니다.

XMLHttpRequest를 사용하여 양식을 보낼 수 없습니다. JSON.stringify (양식)를 사용했지만 wireshark가 요청이 다중/양식 데이터 요청이 아니라고 알려줍니다.

파일을 업로드하려면 '요청'모듈을 사용해야합니다. 다음은 나를 위해 일했습니다 :

exports.unwrappeduploadToOctoprint = function(){ 
    "use strict" ; 
    var form ={ 
    file: { 
      value: fs.readFileSync(__dirname+'/test2.gcode'), 
      options: { filename: 'test2.gcode'} 
     } 
    }; 

    var options = { 
    method: 'POST', 
    url: 'http://192.168.1.24/api/files/local', 
    headers: { 'x-api-key': 'E0A2518FB11B40F595FC0068192A1AB3'}, 
    formData: form 
    }; 

    var req = request(options, function (error, response, body) { 
    if (error) throw new Error(error); 
    console.log(body); 
    }); 
}; 
+0

이것은 나를 위해 일했습니다. 내가 CSV 파일을 전달하는 DashDB의 REST API를 실행하려고했습니다. 그러나 나는 fs.readFileSync에 대해 조금 걱정하고있다. 파일 크기가 약 500MB 또는 GB 인 경우 어떻게됩니까? –

0

이 보인다는. 대신 아래 코드 스 니펫을 사용하십시오. 이 작업을 오랜 시간 후 필요에

var fileToUpload = document.getElementById('input').files[0]; 
var data = new FormData(); 
data.append("myfile", fileToUpload); 

var xhr = new XMLHttpRequest(); 
xhr.open('POST', "upload_endpoint"); 
xhr.send(data); 
+0

동일한 오류를 반환합니다 : 'TypeError : 첫 번째 인수는 문자열 또는 버퍼 여야합니다.' 그 이유가 무엇인지 알 수 있습니까? –

+0

@ ClémentVgnc 당신이 수정 된 코드 스 니펫을 공유 할 수 있습니다 –

+0

물론! 내가 편집 한 내 게시물 –