当我尝试通过 AWS 控制台将包含子文件夹的文件夹上传到 S3时,只上传文件而不上传子文件夹。
您也不能选择一个文件夹。总是需要先打开该文件夹才能选择任何内容。
这有可能吗?
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 用户来说就足够了
$ zip -r archive_name.zip folder_to_compress
我建议您使用 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 中测试过,它运行得很好。
拖放文件和文件夹后,此屏幕最终打开以上传内容。
您可以对这些文件夹进行 拖放。只有 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 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>