Ste*_*en_ 5 amazon-s3 amazon-web-services node.js
我正在尝试使用NodeJS将我目录中的所有文件上传到我的S3存储桶.如果我明确给出Key:字段的文件路径+文字字符串,我一次能上传一个文件.
下面是我正在使用的脚本:
var AWS = require('aws-sdk'),
fs = require('fs');
// For dev purposes only
AWS.config.update({ accessKeyId: '...', secretAccessKey: '...' });
// reg ex to match
var re = /\.txt$/;
// ensure that this file is in the directory of the files you want to run the cronjob on
// ensure that this file is in the directory of the files you want to run the cronjob on
fs.readdir(".", function(err, files) {
if (err) {
console.log( "Could not list the directory.", err)
process.exit( 1 )
}
var matches = files.filter( function(text) { return re.test(text) } )
console.log("These are the files you have", matches)
var numFiles = matches.length
if ( numFiles ) {
// Read in the file, convert it to base64, store to S3
for( i = 0; i < numFiles; i++ ) {
var fileName = matches[i]
fs.readFile(fileName, function (err, data) {
if (err) { throw err }
// Buffer Pattern; how to handle buffers; straw, intake/outtake analogy
var base64data = new Buffer(data, 'binary');
var s3 = new AWS.S3()
s3.putObject({
'Bucket': 'noonebetterhaventakenthisbucketnname',
'Key': fileName,
'Body': base64data,
'ACL': 'public-read'
}, function (resp) {
console.log(arguments);
console.log('Successfully uploaded, ', fileName)
})
})
}
}
})
Run Code Online (Sandbox Code Playgroud)
它会为尝试上载到S3的每个文件生成此错误:
These are the files you have [ 'test.txt', 'test2.txt' ]
{ '0': null,
'1': { ETag: '"2cad20c19a8eb9bb11a9f76527aec9bc"' } }
Successfully uploaded, test2.txt
{ '0': null,
'1': { ETag: '"2cad20c19a8eb9bb11a9f76527aec9bc"' } }
Successfully uploaded, test2.txt
Run Code Online (Sandbox Code Playgroud)
编辑:使用变量名更新以允许读取键而不是matches[i]
为什么它只上传test2.txt,如何让它上传我的matches变量中的每个文件?
引用此异步读取和缓存nodejs中的多个文件 以获得解决方案.
tl; dr scope问题 - 需要将变量包装在闭包中; 可以通过创建一个功能做到这一点readFile,并s3.putObject并调用内部的for循环.
var AWS = require('aws-sdk'),
fs = require('fs');
// For dev purposes only
AWS.config.update({ accessKeyId: '...', secretAccessKey: '...' });
var s3 = new AWS.S3()
function read(file) {
fs.readFile(file, function (err, data) {
if (err) { throw err }
// Buffer Pattern; how to handle buffers; straw, intake/outtake analogy
var base64data = new Buffer(data, 'binary');
s3.putObject({
'Bucket': 'noonebetterhaventakenthisbucketnname',
'Key': file,
'Body': base64data,
'ACL': 'public-read'
}, function (resp) {
console.log(arguments);
console.log('Successfully uploaded, ', file)
})
})
}
// reg ex to match
var re = /\.txt$/;
// ensure that this file is in the directory of the files you want to run the cronjob on
fs.readdir(".", function(err, files) {
if (err) {
console.log( "Could not list the directory.", err)
process.exit( 1 )
}
var matches = files.filter( function(text) { return re.test(text) } )
console.log("These are the files you have", matches)
var numFiles = matches.length
if ( numFiles ) {
// Read in the file, convert it to base64, store to S3
for( i = 0; i < numFiles; i++ ) {
read(matches[i])
}
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9938 次 |
| 最近记录: |