使用请求或axios nodejs将文件上传到另一个服务器
问题描述:
我有一个用户表单,用户可以在其系统中选择一个文件并使用FormData将其上载到另一个服务器。当测试直接发送到api时它工作正常。但是我需要在发送之前修改头文件。所以我发布到客户端应用程序的后端。使用请求或axios nodejs将文件上传到另一个服务器
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!');
});
});
axios
或request
的伟大工程张贴范式或GET请求。但是当我尝试使用它来发送文件时,它不起作用。上面的代码总是返回成功,但不会上传文件。所以我去here,仍然不明白,看看我失踪。
我有验证和跟踪关闭其他服务器(本地),而测试,所以我不必修改标题。它具有如下的代码,如果我的文件直接从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')
})
});
我看到this问题,并认为这可能意味着它不会与爱可信可能但你如何处理请求?例如,在post ... upload
代码中,我如何将my_file
作为用户在其表单中选择的文件?为什么即使它没有上传文件也不会失败?
答
我改变了客户端的后端应用程序下面,它让我可以修改页眉和发送形式:
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')
})
});