使用请求或axios nodejs将file upload到另一台服务器

我有一个用户表单,用户可以在他们的系统上select一个文件,并使用FormData将其上传到另一个服务器。 testing直接发送到api时,它工作正常。 但是我需要在发送之前修改头文件。 所以我发布到客户端应用程序的后端。

router.post('/upload', function(req, res, next) { //...some axios or request logic var fs = require('fs'); var request = require('request'); var formData = { my_field: 'my_value', my_file: fs.createReadStream(__dirname + '/example.doc'), }; request.post({url:'http://someothereapp/upload-file', formData: formData}, function(err, httpResponse, body) { if (err) { return console.error('upload failed:', err); } console.log('Upload successful! Server responded with:', body); res.send('good!'); }); }); 

axiosrequest非常适合发布正常表单或获取请求。 但是,当我尝试使用它来发送文件不起作用。 上面的代码总是返回成功,但不上传文件。 所以我去了这里 ,仍然不够明白我缺less的东西。

在testing时,我在其他服务器(本地)上closures了身份validation和跟踪function,所以我不必修改头文件。 它具有以下代码工作正常,如果我直接从Web表单发送文件,但不是从我的客户端快递应用程序:

  // http://someothereapp/upload-file router.post('/upload-file', (req, res, next) => { let multer = require('multer') let p = path.join(__dirname, '../uploads'); let storage = multer.diskStorage({ destination: function(req, file, callback) { callback(null, p ) }, filename: function(req, file, callback) { console.log('what is file', file) callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)) } }) let upload = multer({ storage: storage }).single('userFile') upload(req, res, function(err) { res.end('File is uploaded') }) }); 

我看到这个问题,认为这可能意味着它不可能与axios,但你怎么做的要求? 例如,在post ... upload代码中,如何让my_file成为用户在表单中select的文件? 为什么即使不上传文件也不失败?

我将客户端后端应用程序更改为以下,它允许我修改标题并发送表单:

 router.post('/upload-file', function(req, res, next) { var httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({headers: customHeader}); proxy.web(req, res, { target: 'http://someothereapp' }, function(e) { // will proxy request to http://someothereapp/upload-file ... }); }); 

客户表格(不变):

 <form name='uploadfile' enctype="multipart/form-data" method="post"> <input type="file" name="userFile" /> <input type="submit" value="Upload File" name="submit"> </form> <script> var form = document.forms.namedItem("uploadfile"); form.addEventListener('submit', function(ev) { var oOutput = document.querySelector("div"), oData = new FormData(form); var oReq = new XMLHttpRequest(); oReq.open("POST", "/upload-file", true); oReq.onload = function(oEvent) { if (oReq.status == 200) { // oOutput.innerHTML = "Uploaded!"; console.log('Uploaded'); } else { console.log('error', oReq.status); // oOutput.innerHTML = "Error " + oReq.status + " occurred when trying to upload your file.<br \/>"; } }; oReq.send(oData); ev.preventDefault(); }, false); </script> 

目标服务器(不变):

  // http://someothereapp/upload-file router.post('/upload-file', (req, res, next) => { let multer = require('multer') let p = path.join(__dirname, '../uploads'); let storage = multer.diskStorage({ destination: function(req, file, callback) { callback(null, p ) }, filename: function(req, file, callback) { console.log('what is file', file) callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)) } }) let upload = multer({ storage: storage }).single('userFile') upload(req, res, function(err) { res.end('File is uploaded') }) });