0

node.jsを使用してS3バケットから複数のファイルをダウンロードする必要があります。そのためにはfor loop &をダウンロードしてs3.getObject(param)メソッドをダウンロードしてください。ファイルがダウンロードされた後、私はその内容をマージする必要があります。node.jsのAmazon S3バケットからファイルを同期的にダウンロードする方法

私はこのように書かれている:

var fileContentList = new ArrayList(); 

for(i=0; i<fileNameList.length i++){ 
    s3.getObject({ Bucket: "my-bucket", Key: fileNameList.get(i) }, function (error, data) { 
    if (error != null) { 
     alert("Failed to retrieve an object: " + error); 
    } else { 
     alert("Loaded " + data.ContentLength + " bytes"); 
     fileContentList.add(data.Body.toString()); 
    } 
    } 
); 
} 

//Do merging with the fileContentList. 

しかしs3.getObjectが非同期呼び出しであると私はマージをやっている間、&何も上の現在のスレッドの移動はfileContentListに追加されます。

どうすれば問題を解決できますか?何か案が?
aws-sdkの同期方法でファイルをダウンロードしていますか?

答えて

0

。私はAlexanderの答えを試していませんが、Lena &Sébastian私はそれらの言葉の答えのそれぞれがこの場合もうまくいくと信じています。彼らの多くの多くの多くの彼らの迅速な返信のおかげで:

Async.eachSeries(casCustomersList, function (customerName, next){ 
     if(casCustomersList.length>0 && customerName != customerId) { 

      var paramToAws = { 
       Bucket: bucketName, 
       Key: folderPath +'applicationContext-security-' + customerName + '.xml'  //file name 
      }; 
      AWSFileAccessManager.downloadFile(paramToAws, function (error, result) { 
       if (error) { 
        next(error); 
       } else { 
        customerApplicationContext.add(result.Body.toString()); 
        next(); 
       } 

      }); 
     } else{ 
      next(); 
     } 

    }, function(err) { 
     //Write the rest of your logic here to process synchronously as it is the callback function 

    } 
3

約束は

var getObject = function(keyFile) { 
    return new Promise(function(success, reject) { 
     s3.getObject(
      { Bucket: "my-bucket", Key: keyFile }, 
      function (error, data) { 
       if(error) { 
        reject(error); 
       } else { 
        success(data); 
       } 
      } 
     ); 
    }); 
} 

var promises = []; 
var fileContentList = new ArrayList(); 

for(i=0; i<fileNameList.length i++){ 
    promises.push(getObject(fileNameList.get(i))); 
} 

Promise.all(promises) 
.then(function(results) { 
    for(var index in results) { 
     var data = results[index]; 
     fileContentList.add(data.Body.toString()); 
    } 
    // continue your process here 
}) 
.catch(function(err) { 
    alert(err); 
}); 
0

あなたはここで、各非同期使用することができ、それは並列ですべてのファイルをダウンロードしますが、より良い方法です。 この例では、ファイルの一部が失敗した場合にダウンロードが続行されます。エラーが発生した場合にファイルのダウンロードを停止し、エラーが発生したコールバックを呼び出すと、直ちに最終コールバックが呼び出されます。

async documentation

var async = require('async'); 
var fileContentList = new ArrayList(); 
function downloadS3Multiple(done){ 
    async.each([ 
      function (callback) { 
       s3.getObject({Bucket: "my-bucket", Key: fileNameList.get(i)}, function (err, res) { 
        if (err) { 
         alert("Failed to retrieve an object: " + error); 
         callback(); 
        } 
        else { 
         alert("Loaded " + data.ContentLength + " bytes"); 
         fileContentList.add(data.Body.toString()); 
         callback(); 

        } 
       }) 
      } 
     ], function (err, results) { 
      done(err, fileContentList) 
     }); 
} 
0

あなたが別のリストで、それぞれのダウンロードはそれらがすべて完了しているかどうかを確認完了として開始のダウンロードを記録しておいてください。あなただけのファイルをマージしたい場合は

var fileContentList = new ArrayList(); 
var completedList = new ArrayList(); 
// function to setDone and initiate merge if all download attempts completed. 
function setDone(i) { 
    completedList[i]=true; 
    var allDone= true; 
    for(i=0; i<completedList.length && allDone=completedList[i] && allDone; i++); 
    if(allDone) { 
     mergeFiles(); 
    } 
} 

// fill completedList with a false value for each fill to be downloaded 
for(i=0; i<fileNameList.length;i++) completedList.add(false); 

// initiate the downloads 
for(i=0; i<fileNameList.length; i++){ 
    s3.getObject({ Bucket: "my-bucket", Key: fileNameList.get(i) }, function (error, data) { 
    if (error != null) { 
     alert("Failed to retrieve an object: " + error); 
    } else { 
     alert("Loaded " + data.ContentLength + " bytes"); 
     fileContentList.add(data.Body.toString()); 
    } 
    setDone(i); 
    } 
); 
} 

よりエレガントなソリューション、すべてのダウンロードが正常に完了した場合:私はこれを使用して解決した

var fileContentList = new ArrayList(); 

for(i=0; i<fileNameList.length i++){ 
    s3.getObject({ Bucket: "my-bucket", Key: fileNameList.get(i) }, function (error, data) { 
    if (error != null) { 
     alert("Failed to retrieve an object: " + error); 
    } else { 
     alert("Loaded " + data.ContentLength + " bytes"); 
     fileContentList.add(data.Body.toString()); 
    } 
    if(fileContentList.length==fileNameList.length) combineFiles(); 
    } 
); 
} 
関連する問題