2014-03-05 306 views
17

我正在写从URL下载图像的应用程序,然后将其上传到使用aws-sdk的S3桶。文件,并将其上传到AWS S3没有保存 - Node.js的

Perviously我只是下载图像,并将它们保存到磁盘这样。

request.head(url, function(err, res, body){ 

    request(url).pipe(fs.createWriteStream(image_path)); 

}); 

然后上传图像到AWS S3这样

fs.readFile(image_path, function(err, data){ 
    s3.client.putObject({ 
     Bucket: 'myBucket', 
     Key: image_path, 
     Body: data 
     ACL:'public-read' 
    }, function(err, resp) { 
     if(err){ 
      console.log("error in s3 put object cb"); 
     } else { 
      console.log(resp); 
      console.log("successfully added image to s3"); 
     } 
    }); 
}); 

但我想跳过部分,我将图像保存到磁盘。有没有办法我可以piperequest(url)到一个变量的响应然后上传呢?

回答

16

下面是一些JavaScript,这是否很好:

var options = { 
     uri: uri, 
     encoding: null 
    }; 
    request(options, function(error, response, body) { 
     if (error || response.statusCode !== 200) { 
      console.log("failed to get image"); 
      console.log(error); 
     } else { 
      s3.putObject({ 
       Body: body, 
       Key: path, 
       Bucket: 'bucket_name' 
      }, function(error, data) { 
       if (error) { 
        console.log("error downloading image to s3"); 
       } else { 
        console.log("success uploading to s3"); 
       } 
      }); 
     } 
    }); 
+6

书面的代码加载整个身体成内存一次(作为一个字符串进入“body”变量)。也就是说,这不会直接从请求流到S3。 OTOH,如果“编码”为空,请求将为“body”创建一个Buffer对象;请参阅https://github.com/request/request#requestoptions-callback。我建议编辑这个答案,将'encoding:'binary''更改为'encoding:null'并消除'body = new Buffer(body,'binary')'。这将消除将整个“身体”存储在记忆中的需要,我认为这符合原始问题和答案。但评论想评论... –

+1

我想你的做法,都与隐性和显性编码,我发现我上传的PNG文件损坏,由于某种原因,无法找出原因。试图复制这一形象https://openclipart.org/image/250px/svg_to_png/264091/MirrorCarp.png,这就是我得到我斗http://images.quickhunts.com/clipart/23234234234.png –

+0

@ Ilanlewin它绝对与'png'图像一起工作,但要确保正确执行'fs.readFile'。从我最初写这个答案开始,它可能已经发生了变化,您可能需要更加具体地使用编码。也可能尝试一些'JPG'或其他通用图像。 – Loourr

0

这是我做的,并很好地工作:

const request = require('request-promise') 
 
const AWS = require('aws-sdk') 
 
const s3 = new AWS.S3() 
 

 
const options = { 
 
    uri: uri, 
 
    encoding: null 
 
}; 
 

 
async load() { 
 

 
    const body = await request(options) 
 
    
 
    const uploadResult = await s3.upload({ 
 
    Bucket: 'bucket_name', 
 
    Key : path, 
 
    Body : body, 
 
    }).promise() 
 
    
 
}

相关问题