当我尝试通过AWS控制台将带有子文件夹的文件夹上传到S3时,仅上传文件而不是子文件夹。
您也无法选择文件夹。始终需要先打开文件夹,然后才能选择任何内容。
这有可能吗?
Answers:
您不需要增强的上载器(我认为不再存在)或任何第三方软件(总是有风险,有人会从S3存储桶甚至从所有AWS资源中窃取您的私有数据或访问密钥)。
由于新的AWS S3 Web Upload Manager支持拖放文件和文件夹,因此只需登录https://console.aws.amazon.com/s3/home并照常开始上传过程,然后只需将文件夹从桌面直接转到S3页面。
我建议您使用AWS CLI。由于使用命令行和awscli非常容易
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
或者您可以使用同步方式
aws s3 sync SOURCE_DIR s3://DEST_BUCKET/
请记住,您必须安装aws cli并使用访问密钥ID和秘密访问密钥ID对其进行配置
pip install --upgrade --user awscli
aws configure
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
不会导致的创建s3://DEST_BUCKET/SOURCE_DIR
,但是大多数时候通常会自动创建此远程文件夹。
s3://DEST_BUCKET/SOURCE_DIR
aws s3 cp命令中创建的正确方法是什么。我只是在s3存储桶上手动创建了一个具有相同名称的文件夹,然后将其递归复制到该文件夹中。
Amazon S3控制台现在支持上传整个文件夹层次结构。在“上载”对话框中启用“增强的上载器”,然后将一个或多个文件夹添加到上载队列。
解决方案1:
var AWS = require('aws-sdk');
var path = require("path");
var fs = require('fs');
const uploadDir = function(s3Path, bucketName) {
let s3 = new AWS.S3({
accessKeyId: process.env.S3_ACCESS_KEY,
secretAccessKey: process.env.S3_SECRET_KEY
});
function walkSync(currentDirPath, callback) {
fs.readdirSync(currentDirPath).forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walkSync(filePath, callback);
}
});
}
walkSync(s3Path, function(filePath, stat) {
let bucketPath = filePath.substring(s3Path.length+1);
let params = {Bucket: bucketName, Key: bucketPath, Body: fs.readFileSync(filePath) };
s3.putObject(params, function(err, data) {
if (err) {
console.log(err)
} else {
console.log('Successfully uploaded '+ bucketPath +' to ' + bucketName);
}
});
});
};
uploadDir("path to your folder", "your bucket name");
解决方案2:
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
我在这里看不到Python的答案。您可以使用Python / boto3编写脚本文件夹上传脚本。以下是从目录树递归获取所有文件名的方法:
def recursive_glob(treeroot, extention):
results = [os.path.join(dirpath, f)
for dirpath, dirnames, files in os.walk(treeroot)
for f in files if f.endswith(extention)]
return results
以下是使用Python / boto将文件上传到S3的方法:
k = Key(bucket)
k.key = s3_key_name
k.set_contents_from_file(file_handle, cb=progress, num_cb=20, reduced_redundancy=use_rr )
我用这些想法写了Directory-Uploader-For-S3
您可以拖放这些文件夹。仅Chrome和Firefox浏览器支持拖放功能。请参阅此链接 https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html
您可以使用传输管理器上传多个文件,目录等,有关更多信息:
https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-transfermanager.html
考虑使用CloudBerry Explorer免费软件将完整的文件夹结构上传到Amazon S3。
您无法通过在线工具上传类似的嵌套结构。我建议使用类似Bucket Explorer的工具进行更复杂的上传。