使用xmlhhtprequest

时间:2016-06-28 14:55:57

标签: ajax node.js asynchronous xmlhttprequest multipartform-data

我正在尝试将文件上传到Octoprint的REST Api,这应该通过发送Content-Type: multipart/form-data的POST请求来完成 (http://docs.octoprint.org/en/master/api/fileops.html#upload-file

我正在使用NodeJS和两个库,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);

2 个答案:

答案 0 :(得分:1)

经过很长时间的努力,我终于设法上传了一个文件。如果您使用NodeJS,请不要依赖MDN文档:它告诉库应该做什么,而不是它们在节点平台上实际可以做什么。您应该只关注GitHub上提供的文档。

目前似乎无法使用XMLHttpRequest发送表单:我尝试使用JSON.stringify(表单)但是wireshark告诉我该请求不是multipart / formdata请求。

如果您想上传文件,则应该使用“请求”#39;模块。以下对我有用:

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);
  });
};

答案 1 :(得分: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);