我正在尝试将文件上传到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);
答案 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);