0

私は私がNodeJSと2を使用していますContent-Type: multipart/form-datahttp://docs.octoprint.org/en/master/api/fileops.html#upload-file)とPOSTリクエスト非同期フォームデータのPOSTリクエストxmlhhtprequestと

を送信することにより行われるべきOctoprintのREST APIのにファイルをアップロードしようとしていますライブラリ、XmlHttpRequest、およびフォームデータ。しようとすると:私は( "POST"、URL、false)をxhr.open使用して同期要求を行った場合、この、

TypeError: first argument must be a string or Buffer 

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ラインでエラーが出ますエラーが消えます。

なぜそうですか?非同期要求に変換する方法はありますか?

EDIT実際には、私は実際にそのドキュメントを理解していません。 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はリクエストがmultipart/formdataリクエストではないことを通知します。

ファイルをアップロードする場合は、「request」モジュールを使用する必要があります。以下は私のために働いています:

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

もちろん!私は投稿を編集しました –

関連する問題