我正在尝试在我的Node Express服务器上处理POST请求以处理多部分表单上传,在我的情况下,用户正在上传图像.
我想通过我的Express应用程序将上传管道传输到另一台服务器,该应用程序当前设置为使用body解析器,我也看到它不支持多部分bodes,而是建议使用其他一些库.
我见过多方,但我不确定如何在我的客户端应用程序中使用它.
在我的客户端代码中,我发布了一个FormData对象,如下所示:
function create(data, name) { var formData = new FormData(); formData.append('file', data, name); return this.parentBase.one('photos').withHttpConfig({transformRequest: angular.identity}).customPOST(formData, undefined, undefined, {'Content-Type': undefined}); }
注意:我正在使用AngularJS的Restangular库,如此处所述
因此,根据我对多方文档的理解,我必须处理表单上传事件,并在表单上传完成后再对其进行操作.
问题是,我希望我可以直接将上传管道传输到另一台服务器.事先我的客户端应用程序直接调用这个其他服务器,但我现在正试图通过Express获取所有路由,这是可能的,还是我必须使用像multiparty这样的东西?
请求文档提供了使用formData的示例,但我不确定这对于我看到的多方示例如何工作.例如,一旦使用mutliparty在Express中完成上传,那么我是否必须构造另一个formData对象然后再发出请求,或者我必须将每个部分传递给另一个服务器?
我很困惑,请有人帮我清理一下吗?
谢谢
编辑
好的,我看了一下multer跟随@yarons评论,这似乎是我想要使用的东西,我试图用我的快速路由器设置如下:
routes.js
var express = require('express'), router = express.Router(), customers = require('./customers.controller.js'), multer = require('multer'), upload = multer(); router.post('/customers/:customerId/photos/', upload.single('file'), customers.createPhoto);
controller.js
module.exports.createPhoto = function(req, res) { console.log(req.file); var options = prepareCustomersAPIHeaders(req); options.formData = req.file; request(options).pipe(res); };
在上面的控制器中注销req.file属性我看到:
{ fieldname: 'file', originalname: '4da2e703044932e33b8ceec711c35582.jpg', encoding: '7bit', mimetype: 'image/png', buffer:, size: 105868 }
这是我通过客户端代码发布的内容:
var formData = new FormData(); formData.append('file', data, name); return this.parentBase.one('photos').withHttpConfig({transformRequest: angular.identity}).customPOST(formData, undefined, undefined, {'Content-Type': undefined});
我尝试过的是明智的吗?只有它不起作用,我从我正在尝试发布的服务器收到错误.事先我把这个帖子请求直接发送到服务器它一切正常,所以我的Express\Multer设置必定有问题
编辑2
好吧,所以在经过更多的搜索后,我发现这篇文章使用multiparty,我有经理在我的设置中工作如下:
var request = require('request'), multiparty = require('multiparty'), FormData = require('form-data'); module.exports.createPhoto = function(req, res) { //console.log(req.file); var options = prepareCustomersAPIHeaders(req), form = new multiparty.Form(); options.headers['Transfer-Encoding'] = 'chunked'; form.on('part', function(part){ if(part.filename) { var form = new FormData(), r; form.append(part.name, part, {filename: part.filename, contentType: part['content-type']}); r = request(options, function(err, response, body){ res.status(response.statusCode).send(body); }); r._form = form } }); form.on('error', function(error){ console.log(error); }); form.parse(req); };
这是现在按预期上传文件到我的其他服务器,虽然这个解决方案有效,我不喜欢这条线:
r._form = form
似乎是将一个私有表单变量分配给请求对象,另外我在多方页面上看不到以这种方式记录的任何内容
任何人都可以对这个可能的解决方案发表任