列出所有目录和所有文件,并使用Node.JS将它们上传到我的存储桶(S3 Amazon)

时间:2014-10-08 02:00:32

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

以下代码:

我正在使用findit walker,这里的文档 - > https://github.com/substack/node-findit

使用这个软件包,我列出了我的应用程序的所有目录和文件,并且我正在尝试使用我自己的代码发送到我的存储桶(使用我自己的代码)。

我不确定代码是否正确,我不知道我需要将什么放在Body中,在params对象内。

这部分它正在收听我的应用程序的所有目录:

finder.on('directory', function (dir, stat, stop) {
    var base = path.basename(dir);
    if (base === '.git' || base === 'node_modules' || base === 'bower_components') {
        stop();
    }
    else {
        console.log(dir + '/');
    }
});

这一个它正在收听我的应用程序的所有文件:

finder.on('file', function (file, stat) {
  console.log(file);
});

我更新了它以将数据发送到我的存储桶,如下所示:

finder.on('file', function (file, stat) {
    console.log(file);
    var params = {
        Bucket: BUCKET_NAME,
        Key: file,
        //Body:
    };
    //console.log(params.body);


    s3.putObject(params, function(err) {
        if(err) {
            console.log(err);
        }
        else {
            console.log("Success!");
        }
    });
});

我真的不知道我需要把什么放在Body里面,我不知道代码是否正确。有人可以帮帮我吗?

感谢。

帮助,所有代码,所有代码:

var fs = require('fs');
var finder = require('findit')(process.argv[2] || '.');
var path = require('path');
var aws = require('aws-sdk');

var s3 = new aws.S3();
aws.config.loadFromPath('./AwsConfig.json');
var BUCKET_NAME = 'test-dev-2';



finder.on('directory', function (dir, stat, stop) {
    var base = path.basename(dir);
    if (base === '.git' || base === 'node_modules' || base === 'bower_components') {
        stop();
    }
    else {
        console.log(dir + '/');
    }
});

finder.on('file', function (file, stat) {
    console.log(file);
    var params = {
        Bucket: BUCKET_NAME,
        Key: file,
        //Body:
    };
    //console.log(params.body);


    s3.putObject(params, function(err) {
        if(err) {
            console.log(err);
        }
        else {
            console.log("Success");
        }
    });
});

finder.on('error', function (err) {
    console.log(err);
});

finder.on('end', function () {
    console.log('Done!');
});

2 个答案:

答案 0 :(得分:2)

根据documentationBody的{​​{1}}参数可以采用s3.putObject,类型数组,Blob,Buffer或{{1} }。在大多数情况下使用的最好的一个是String。您可以使用ReadableStream模块中的createReadStream() function从任意文件创建ReadableString

因此,您的代码看起来像是:

ReadableString

我还想指出,如果你传递一个包含大量文件的目录,你可能会遇到这个代码的问题。 fs是一个异步函数,这意味着它会被调用,然后代码会在它正在做的事情时转移到其他东西上(好吧,这是一个简单的简化,但你可以想到这一点)。就这段代码而言,这意味着你基本上同时上传它找到的所有文件;那不好。

我建议您使用async modulequeue文件上传内容,以便一次只发生一些内容。

基本上,您将finder.on('file', function (file, stat) { console.log(file); var params = { Bucket: BUCKET_NAME, Key: file, Body: fs.createReadStream(file) // NOTE: You might need to adjust "file" so that it's either an absolute path, or relative to your code's directory. }; s3.putObject(params, function(err) { if(err) { console.log(err); } else { console.log("Success!"); } }); }); 事件处理程序中的代码移动到队列的worker方法中,如下所示:

putObject

注意那里的file,它指定你的并发性,在这种情况下,是一次上传多少文件。

然后,您的var async = require('async'); var uploadQueue = async.queue(function(file, callback) { var params = { Bucket: BUCKET_NAME, Key: file, Body: fs.createReadStream(file) // NOTE: You might need to adjust "file" so that it's either an absolute path, or relative to your code's directory. }; s3.putObject(params, function(err) { if(err) { console.log(err); } else { console.log("Success!"); } callback(err); // <-- Don't forget the callback call here so that the queue knows this item is done }); }, 2); // <-- This "2" is the maximum number of files to upload at once 事件处理程序变为:

2

这将排队找到的所​​有文件,并一次上传2个文件,直到它们全部通过。

答案 1 :(得分:0)

一个更容易且可以说是更有效的解决方案可能是仅对目录进行tar操作并上传该单个tar文件(如果需要也可以进行gzip压缩)。在npm上有tar模块,但你也可以为它生成一个子进程。