使用 S3和 AWS 控制台上传包含子文件夹的文件夹

当我尝试通过 AWS 控制台将包含子文件夹的文件夹上传到 S3时,只上传文件而不上传子文件夹。

您也不能选择一个文件夹。总是需要先打开该文件夹才能选择任何内容。

这有可能吗?

166835 次浏览

Amazon S3控制台现在支持上传整个文件夹层次结构。在“上传”对话框中启用“增强上传器”,然后向上传队列添加一个或多个文件夹。

Http://console.aws.amazon.com/s3

通常,我使用通过 AWS 管理控制台提供的 增强型上载程式。然而,由于这需要 Java,它可能会导致问题。我发现 S3cmd是一个很好的命令行替代品。我是这么用的:

s3cmd --configure   # enter access keys, enable HTTPS, etc.
s3cmd sync <path-to-folder> s3://<path-to-s3-bucket>/

你不需要增强型上传器(我相信现在已经不存在了)或任何第三方软件(总是有风险,有人会窃取你的私人数据或访问密钥从 S3桶,甚至从所有的 AWS 资源)。

由于新的 AWS S3 Web Upload Manager 支持 拖放文件和 文件夹文件,只需登录到 https://console.aws.amazon.com/s3/home并像往常一样开始上传过程,然后只需将文件夹从桌面直接拖动到 S3页面。

值得一提的是,如果只是使用 S3进行备份,那么只需压缩文件夹,然后上传即可。这将节省您上传的时间和成本。

如果你不知道如何做有效的压缩从终端看看 给你的 OSX。

以及适用于 Windows 的 $ zip -r archive_name.zip folder_to_compress。 或者,像 7-Zip这样的客户端对于 Windows 用户来说就足够了

我建议您使用 AWS CLI。因为使用命令行和 awscli 非常容易

    aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive

或者可以使用 sync by

    aws s3 sync SOURCE_DIR s3://DEST_BUCKET/

请记住,您必须安装 awscli 并使用您的访问密钥 ID 和保密访问密钥 ID 对其进行配置

     pip install --upgrade --user awscli
aws configure

我看不到巨蟒的答案。 您可以使用 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 )

我用这些想法写了 目录上载程式

我来这里是为了解决这个问题。有了这个版本,你可以拖放一个文件夹到里面,这样就可以工作了,即使它不允许你在打开上传对话框的时候选择一个文件夹。

在 S3中找到增强的上传工具用于上传文件夹和子文件夹时,我遇到了问题。但是,我不需要找到一个工具,我可以上传文件夹以及它里面的子文件夹通过简单地拖放它在 S3桶。

注意: 这个拖放功能是 在 Safari 中不起作用。我在 Chrome 中测试过,它运行得很好。

Drag and drop

拖放文件和文件夹后,此屏幕最终打开以上传内容。

enter image description here

您可以对这些文件夹进行 拖放。只有 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

您可以通过拖放或指向和单击来上传文件。若要上载文件夹,必须拖放它们。拖放功能只支持 Chrome 和 Firefox 浏览器

解决方案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

执行类似于以下命令的操作:

aws s3 cp local_folder_name s3://s3_bucket_name/local_folder_name/ --recursive

拖放只能用于相对较小的文件集。如果您需要一次上传数千个这样的应用程序,那么 CLI 就是解决方案。我设法上传2,000,00 + 文件使用一个命令..。

自定义端点

如果您有一个由您的 IT 实现的自定义端点,请尝试这样做

aws s3 cp <local-dir> s3://bucket-name/<destination-folder>/ --recursive --endpoint-url https://<s3-custom-endpoint.lan>