2017-08-04 402 views
1

我有一个用户表单,用户可以在其系统中选择一个文件并使用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!'); 
    }); 

}); 

axiosrequest的伟大工程张贴范式或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作为用户在其表单中选择的文件?为什么即使它没有上传文件也不会失败?

回答

1

我改变了客户端的后端应用程序下面,它让我可以修改页眉和发送形式:

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') 
    }) 
    }); 
相关问题