列出所有目录和所有文件,并使用Node.JS将它们上载到my bucket(S3 Amazon)

列出所有目录和所有文件,并使用Node.JS将它们上载到my bucket(S3 Amazon),node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,代码如下: 我正在使用findit walker,这里有文档-> 有了这个包,我列出了我的应用程序的所有目录和文件,并试图将它们发送到AmazonS3上的bucket(使用我自己的代码) 我不确定代码是否正确,我也不知道我需要在params对象中的Body中放入什么 此部分正在侦听我的应用程序的所有目录: finder.on('directory', function (dir, stat, stop) { var base = path.basename(dir); if (b

代码如下:

我正在使用findit walker,这里有文档->

有了这个包,我列出了我的应用程序的所有目录和文件,并试图将它们发送到AmazonS3上的bucket(使用我自己的代码)

我不确定代码是否正确,我也不知道我需要在params对象中的Body中放入什么

此部分正在侦听我的应用程序的所有目录:

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('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);
});
我更新了它,将数据发送到我的bucket,如下所示:

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!");
        }
    });
});
我真的不知道我需要在体内放些什么,也不知道代码是否正确。有人能帮我吗

谢谢

要提供帮助,请输入所有代码,所有代码:

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!');
});

一个更简单、更有效的解决方案可能是对目录加上tar并上传单个tar文件(如果需要,也可以使用gzip)。npm上有tar模块,但您也可以为它生成一个子进程。

基于,
s3的
Body
参数。putObject
可以使用
缓冲区、键入数组、Blob、
字符串或
可读流
。在大多数情况下,最好使用
ReadableString
。您可以使用
fs
模块中的从任何文件创建
ReadableString

因此,代码的这一部分看起来像:

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!");
        }
    });
});
我还想指出,如果您将一个包含大量文件的目录传递给它,您可能会遇到此代码的问题
putObject
是一个异步的函数,这意味着它将被调用,然后代码将在执行其任务时转移到其他内容(好的,这是一个粗略的简化,但您可以这样想)。这段代码的意思是,您将同时上载它找到的所有文件;那不好

我的建议是使用类似的方法来上传文件,这样一次只能上传几次

实际上,您需要将
文件中的代码
事件处理程序移动到队列的worker方法,如下所示:

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个文件,直到它完成所有文件。

请将代码的相关部分直接复制并粘贴到问题中,而不是张贴问题的图像。我们不能对图像做太多。对不起,我认为整个代码的图片会更好,请稍等@MikeS。没问题。人们通常会复制您的部分或全部代码,并试图重现问题,以确定您的问题的最佳答案。这对图像来说并不容易:)我觉得现在看起来好多了@MikeS:d好多了:)不,只是做了一段时间;)嗨,迈克,推球是怎么用的?我知道push方法只是为了加入数组。。。哈哈。。更新:NEVERMIND,我现在明白了,哈哈,现在没那么多(更关注iOS开发),但自2011年年中以来,我已经在node中编写了不少web应用程序和实用程序。如果这是3个月后的情况,那么你做得很好:)至于
push
,这只是
async
在本例中使用的函数名(与数组中的
push
不同)。之所以这样命名,是因为事情通常被“推”到队列上(然后“弹出”)。