当前位置:  开发笔记 > 编程语言 > 正文

管道多部分表单上传到另一台服务器

如何解决《管道多部分表单上传到另一台服务器》经验,为你挑选了0个好方法。

我正在尝试在我的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

似乎是将一个私有表单变量分配给请求对象,另外我在多方页面上看不到以这种方式记录的任何内容

任何人都可以对这个可能的解决方案发表任

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有