已上传的图像文件上的Request.post

时间:2014-10-16 21:45:44

标签: javascript node.js angularjs express

我在项目中使用Angularjs和nodejs并处理文件上传。我想以安全的方式将post请求发送到url端点,因为我需要将accesstoken与请求相关联。所以我这样做的方式是,我添加了从UI中选择文件的指令,一旦获取文件,我就在控制器中使用FormData()这样附加它

var fd = new FormData();
fd.append('file',myFile);

并将此formdata对象发送到nodejs服务器,如此处所述http://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs

期望此请求将从我那里转到我的nodejs服务器URL我将向外部Web服务发送另一个帖子请求

$http.post('api/collections/upload',fd, {
      transformRequest: angular.identity,
      headers: {
        'Content-type': undefined
     }
});

因此它会在请求中附加正确的内容类型和边界。我在

时获取服务器端nodejs上的文件
function(req,res){
  console.log(req.files); //I am able to see the file content
}

它被上传到nodejs服务器端。 现在我想使用req.files发出一个post请求到一个不同的端点以及正确的accessToken和headers。尝试过很多东西但却无法满足要求。不确定如何将imagedata / req.files与请求一起附加。我尝试了请求npm模块https://www.npmjs.org/package/request

中提到的这两件事

1)

request.post({
    url: 'https://www.example.com/uploadImage',
    headers: {
      'Authorization': <accessToken>,
      'Content-type': 'multipart/form-data'
    },
    body: req.files
 });

不知道如何使用此请求附加二进制数据以及如何设置边界。想要使用此请求发送上传的图像时是否需要边界?

2)

fs.createReadStream(req.files.file.path, {encoding: base64}).pipe(request.post({
    url: 'https://www.example.com/uploadImage',
    headers: {
     'Content-type': 'multipart/form-data'
    }
  })); 

有人可以建议我如何使用请求npm模块发送此帖子请求?感谢。

2 个答案:

答案 0 :(得分:1)

这里的文档有很多例子可以完全按照你的描述进行:

https://github.com/mikeal/request#streaming

从该链接中可以看出,请求库将.pipe()方法添加到您的http req对象中,您应该可以使用该方法比如链接中的例子:

function(req, res) {
  req.pipe(request.post('https://www.example.com/uploadImage');
}

或类似的东西。

你几乎在那里进行了#2尝试,但只有先前将文件写入磁盘并使用fs.createReadStream()

读取文件时才能使用

答案 1 :(得分:1)

你的建议帮助我了解我的尝试是对的。另一篇解决我问题的文章是http://aguacatelang.wordpress.com/2013/01/05/post-photo-from-node-js-to-facebook/。基本上,这就是我所做的并且有效。谢谢你的建议。

var form = new FormData();
form.append('file', fs.createReadStream(__dirname + '/image.jpg'));

var options = {
    url: 'https://www.example.com/uploadImage?access_token='+ <accesstoken>,
    headers: form.getHeaders()
};

form.pipe(request.post(options,function(err,res){
    if(err){
      log.debug(err);
    }
    else {
      log.debug(res);
    }
}));