以下代码:
我正在使用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!');
});
答案 0 :(得分:2)
根据documentation,Body
的{{1}}参数可以采用s3.putObject
,类型数组,Blob,Buffer
或{{1} }。在大多数情况下使用的最好的一个是String
。您可以使用ReadableStream
模块中的createReadStream()
function从任意文件创建ReadableString
。
因此,您的代码看起来像是:
ReadableString
我还想指出,如果你传递一个包含大量文件的目录,你可能会遇到这个代码的问题。 fs
是一个异步函数,这意味着它会被调用,然后代码会在它正在做的事情时转移到其他东西上(好吧,这是一个简单的简化,但你可以想到这一点)。就这段代码而言,这意味着你基本上同时上传它找到的所有文件;那不好。
我建议您使用async
module至queue文件上传内容,以便一次只发生一些内容。
基本上,您将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模块,但你也可以为它生成一个子进程。