2014-12-27 4 views
6

Я в настоящее время загрузить отдельные объекты S3, используя так:Загрузить все дерево каталогов до S3 с помощью AWS SDK в узел JS

var options = { 
     Bucket: bucket, 
     Key: s3Path, 
     Body: body, 
     ACL: s3FilePermissions 
}; 

S3.putObject(options, 
function (err, data) { 
    //console.log(data); 
}); 

Но когда у меня есть папка больших ресурсов, например, я использую инструмент AWS CLI.
Мне было интересно, есть ли способ сделать то же самое с aws sdk (загрузить целые папки на s3)?

ответ

3

Я просто созерцая эту проблему на другой день, и думал, что-то вроде этого:

...  
var async = require('async'), 
    fs = require('fs'), 
    path = require("path"); 

var directoryName = './test', 
    directoryPath = path.resolve(directoryName); 

var files = fs.readdirSync(directoryPath); 
async.map(files, function (f, cb) { 
    var filePath = path.join(directoryPath, f); 

    var options = { 
     Bucket: bucket, 
     Key: s3Path, 
     Body: fs.readFileSync(filePath), 
     ACL: s3FilePermissions 
    }; 

    S3.putObject(options, cb); 

}, function (err, results) { 
    if (err) console.error(err); 
    console.log(results); 
}); 
+2

'fs.readFileSync (Filepath)' эта строка возвращает меня 'Ошибка: EISDIR: недопустимую операцию на каталог, read' как здесь: HTTP : //stackoverflow.com/questions/25883775/node-js-readfilesync-function –

0

Вы можете попробовать node-s3-client.

UPDATE: Доступна НПМ here

Из синхронизации каталога для s3 docs:

UPDATE: Добавлен клиент inialization код.

var client = s3.createClient({ 
    maxAsyncS3: 20,  // this is the default 
    s3RetryCount: 3, // this is the default 
    s3RetryDelay: 1000, // this is the default 
    multipartUploadThreshold: 20971520, // this is the default (20 MB) 
    multipartUploadSize: 15728640, // this is the default (15 MB) 
    s3Options: { 
     accessKeyId: "YOUR ACCESS KEY", 
     secretAccessKey: "YOUR SECRET ACCESS KEY" 
    } 
    }); 

var params = { 
    localDir: "some/local/dir", 
    deleteRemoved: true, // default false, whether to remove s3 objects 
         // that have no corresponding local file. 

    s3Params: { 
    Bucket: "s3 bucket name", 
    Prefix: "some/remote/dir/", 
    // other options supported by putObject, except Body and ContentLength. 
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property 
    }, 
}; 
var uploader = client.uploadDir(params); 
uploader.on('error', function(err) { 
    console.error("unable to sync:", err.stack); 
}); 
uploader.on('progress', function() { 
    console.log("progress", uploader.progressAmount, uploader.progressTotal); 
}); 
uploader.on('end', function() { 
    console.log("done uploading"); 
}); 
+3

Это не работает. Это просто зависает от прогресса. Никакой ошибки, никакого прогресса. –

+0

Вы уверены, что клиент инициализирован правильно? Я отредактировал ответ, чтобы включить инициализацию клиента. – unboundev

+1

Да. Иначе он покажет ошибку. SO no error, клиент инициализируется правильно, но синхронизация не произойдет. –

3

Старинная рекурсивная дорога, которую я спешил в спешке. Используются только модули базового узла и стандартный AWS sdk.

var AWS = require('aws-sdk'); 
var path = require("path"); 
var fs = require('fs'); 

const uploadDir = function(s3Path, bucketName) { 

    let s3 = new AWS.S3(); 

    function walkSync(currentDirPath, callback) { 
     fs.readdirSync(currentDirPath).forEach(function (name) { 
      var filePath = path.join(currentDirPath, name); 
      var stat = fs.statSync(filePath); 
      if (stat.isFile()) { 
       callback(filePath, stat); 
      } else if (stat.isDirectory()) { 
       walkSync(filePath, callback); 
      } 
     }); 
    } 

    walkSync(s3Path, function(filePath, stat) { 
     let bucketPath = filePath.substring(s3Path.length+1); 
     let params = {Bucket: bucketName, Key: bucketPath, Body: fs.readFileSync(filePath) }; 
     s3.putObject(params, function(err, data) { 
      if (err) { 
       console.log(err) 
      } else { 
       console.log('Successfully uploaded '+ bucketPath +' to ' + bucketName); 
      } 
     }); 

    }); 
}; 

uploadDir("path to your folder", "your bucket name"); 

Особая благодарность Али из this post с помогая получить имена файлов