列出所有目录和所有文件,并使用Node.JS将它们上载到my bucket(S3 Amazon)
代码如下: 我正在使用findit walker,这里有文档-> 有了这个包,我列出了我的应用程序的所有目录和文件,并试图将它们发送到AmazonS3上的bucket(使用我自己的代码) 我不确定代码是否正确,我也不知道我需要在params对象中的Body中放入什么 此部分正在侦听我的应用程序的所有目录:列出所有目录和所有文件,并使用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
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
不同)。之所以这样命名,是因为事情通常被“推”到队列上(然后“弹出”)。