如何编写程序以从URL下载一堆图像并将其上传到AWS S3 Server

时间:2018-07-25 16:43:31

标签: javascript node.js amazon-web-services amazon-s3

有人可以帮我编写一个程序,从url下载图像文件并将其上传到AWS S3并删除下载的图像。

var download = function(uri, filename, callback){
  request.head(uri, function(err, res, body){
    console.log('content-type:', res.headers['content-type']);
    console.log('content-length:', res.headers['content-length']);
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};

download('https://www.google.com/images/srpr/logo3w.png', 'google.png', function(){
  console.log('done');
  fs.readFile('google.png', function (err, data) {
      if (err) {
          console.log("Read file failed: "+ err)
          }
 let params = {
     Bucket: waftBucket,
     Key: 'google.png',
     Body: data,
     ContentType: 'image/png',
     ACL: 'public-read'
 };
let s3 = new AWS.S3(); 
 s3.putObject(params, function(err, data) {
   if (err) {
     return console.log('There was an error uploading image: ' + err.message);
   }
   console.log('Successfully Uploaded.');
fs.unlink(google.png);
 });

    });  
});

上面的代码适用于1个文件,但不适用于循环

    var download = function(uri, filename, callback){
  request.head(uri, function(err, res, body){
    console.log('content-type:', res.headers['content-type']);
    console.log('content-length:', res.headers['content-length']);
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};


var getFileName = function(url){
    return url.split("/")[5];
}

var data = {
frags : [
    {url: "https://fimgs.net/images/perfume/375x500.39678.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.39678.jpg")},
    {url: "https://fimgs.net/images/perfume/375x500.4506.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.4506.jpg")},
    {url: "https://fimgs.net/images/perfume/375x500.29601.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.29601.jpg")},
    {url: "https://fimgs.net/images/perfume/375x500.32597.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.32597.jpg")}
]};
for(var i=0; i<data.frags.length; i++){
download(data.frags[i].url, data.frags[i].fileName, function(){
  fs.readFile(data.frags[i].fileName, function (err, data) {
      if (err) {
          console.log("Read file failed: "+ err)
          }
 let params = {
     Bucket: waftBucket,
     Key: 'images/'+data.frags[i].fileName,
     Body: data,
     ContentType: 'image/jpeg',
     ACL: 'public-read'
 };
let s3 = new AWS.S3(); 
 s3.putObject(params, function(err, data) {
   if (err) {
     return console.log('There was an error uploading image: ' + err.message);
   }
   console.log('Successfully Uploaded.');
   fs.unlink(data.frags[i].fileName);
 });

    });  
});
}

还有其他方法吗?是否可以读取URL的内容并将其直接保存到AWS S3存储桶,而无需下载和删除temp文件夹中的文件?

谢谢。

2 个答案:

答案 0 :(得分:0)

在不了解确切用例的情况下,我建议您检出AWS CLI来执行此操作。它提供了一个sync选项,如下所述:

  

同步目录和S3前缀。递归复制新的和更新的   从源目录到目标的文件。仅创建   目标文件夹中是否包含一个或多个文件。

因此,您需要将文件下载到一个临时文件夹,使用CLI与S3同步,然后删除该文件夹(使用rimraf或fs)。

答案 1 :(得分:0)

s3.putObject仅支持每个HTTP请求上传单个对象。

  

由于所有功能都是async,因此使用for循环会造成很多混乱。

因此,您可以使用promise来接一个地提出多个请求,也可以使用@kmukkamala指出的更好的解决方案。

在服务器上安装S3工具,然后运行以下命令来同步整个目录。

s3cmd sync myserverDir s3://bucket/

您可以安排corntab每10-20分钟运行一次脚本,然后删除该文件夹或文件。