【发布时间】:2016-03-19 17:03:39
【问题描述】:
我正在尝试在我的 Node Express 服务器上处理一个 POST 请求以处理多部分表单上传,在我的情况下,用户正在上传图片。
我想通过我的 Express 应用程序将上传内容通过管道传输到另一台服务器,该应用程序当前设置为使用正文解析器,我也看到它不支持多部分 bodes,而是建议使用其他一些库。
我见过multiparty,但我不确定如何在我的客户端应用程序中使用它。
在我的客户端代码中,我发布了一个 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 库,如文档所述 here
因此,根据我对多方文档的了解,我必须处理表单上传事件,并在表单完成上传后进一步采取行动。
问题是,我希望我可以将上传直接通过管道传输到另一台服务器。之前我的客户端应用程序直接调用另一个服务器,但我现在正试图通过 Express 路由所有内容,这可能吗,还是我必须使用多方之类的东西?
请求文档提供了使用formData 的示例,但我不确定这将如何与我看到的多方示例一起使用。例如,一旦使用 mutliparty 在 Express 中完成上传,我是否必须构建另一个 formData 对象然后再发出进一步请求,还是必须将每个部分通过管道传输到另一台服务器?
我很困惑,请有人帮我解决这个问题吗?
谢谢
编辑
好的,我查看了@yarons cmets 之后的 multer,这似乎是我想要使用的那种东西,我尝试将它与我的快速路由器设置一起使用,如下所示:
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: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 fa 00
00 00 fa 08 06 00 00 00 88 ec 5a 3d 00 00 20 00 49 44 41 54 78 5e ac bd f9 8f e
6 e9 7a ... >,
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
好的,所以经过更多的搜索后,我发现了this 使用多方的文章,我有经理在我的设置中工作,如下所示:
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
似乎为请求对象分配了一个私有表单变量,而且我在多方页面上看不到以这种方式记录的任何内容
任何人都可以提供有关此可能解决方案的任何 cmet 吗?
【问题讨论】:
-
你试过multer吗?它是一个中间件,让您在文件上传后就可以访问它,并且您不需要监听上传事件
-
谢谢@yarons,这似乎是一个更简单的库,我已经用我尝试过的代码编辑了我的帖子,但我还不能让它工作。我正在客户端中为 Express 的初始帖子构建一个 formData 对象,因此希望我只是将其用作我想对我的其他服务器进行的请求调用中的 formData 参数值。现在看来我不得不使用两个 formData 对象,这听起来不太对。
-
在this answer 中,有一个使用Needle 将文件从一台服务器发送到另一台服务器的示例(我以前从未尝试过)。抱歉,我只是在向你扔第 3 方包裹......
-
感谢@yarons 的建议,我不太确定是否要查看另一个包。我会继续挖掘,希望有人能提供一些其他的想法。
标签: javascript angularjs node.js express multipartform-data