0

我有一个 Angular 2 应用程序,它将包装在 FormData 对象中的图像发送到我的节点服务器。

我可以在服务器上接收图像并将其写入文件,然后重新下载:

var busboy = new Busboy({ headers: req.headers });
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {


     if(mimetype == "image/png"){
        var saveTo = path.join('/home/ec2-user/bonappetite/tmp', path.basename(filename) + ".png");
     } else if(mimetype == "image/jpeg") {
        var saveTo = path.join('/home/ec2-user/bonappetite/tmp', path.basename(filename) + ".jpg");
     } else {
         var saveTo = path.join('/home/ec2-user/bonappetite/tmp', path.basename(filename));
      }
      file.pipe(fs.createWriteStream(saveTo));

});

busboy.on('finish', function() {
    console.log("url retrieved");
     res.writeHead(200, { 'Connection': 'close' });
    res.end(savedUrl);
});
return req.pipe(busboy);

我想要做的是在 FormData 中获取图像并将其上传到我的 S3 存储桶。我可以自己上传数据,但我似乎无法上传从发布请求中保存的图像

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./aws_config.json');
var s3Bucket = new AWS.S3( { params: {Bucket: 'xxxx'} } );



params = {Key: filename, Body: file};
s3Bucket.putObject(params, function(err, data) {

if (err) {

    console.log(err)

} else {
    var urlParams = {Bucket: 'xxxx', Key: filename};
    s3Bucket.getSignedUrl('getObject', urlParams, function(err, url){
            if(err){
                console.log(err);
                res.status( err.status || 500 );
                res.send( error );
            }else {
                res.setHeader('Content-Type', 'application/json');
                url = url;
                res.send({"url":url});
            }
    })

}
});

如何获取刚刚上传到服务器的文件并将其流式传输到 S3?

在将文件发送到 s3 之前,我什至需要将文件保存到磁盘吗?

谢谢

4

1 回答 1

0

无需保存文件即可找到此问题的解决方案。

与其使用 putObject,不如使用上传。

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./aws_config.json');
var s3Bucket = new AWS.S3( { params: {Bucket: 'xxxx'} } );



params = {Key: filename, Body: file};
s3Bucket.upload(params, function(err, data) {

if (err) {

    console.log(err)

} else {
    var urlParams = {Bucket: 'xxxx', Key: filename};
    s3Bucket.getSignedUrl('getObject', urlParams, function(err, url){
            if(err){
                console.log(err);
                res.status( err.status || 500 );
                res.send( error );
            }else {
                res.setHeader('Content-Type', 'application/json');
                url = url;
                res.send({"url":url});
            }
    })

}
});
于 2017-02-07T17:41:34.863 回答