使用S3和AWS控制台上传带有子文件夹的文件夹


76

当我尝试通过AWS控制台将带有子文件夹的文件夹上传到S3时,仅上传文件而不是子文件夹。

您也无法选择文件夹。始终需要先打开文件夹,然后才能选择任何内容。

这有可能吗?

Answers:


55

您不需要增强的上载器(我认为不再存在)或任何第三方软件(总是有风险,有人会从S3存储桶甚至从所有AWS资源中窃取您的私有数据或访问密钥)。

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


3
拖放'n'不适用于我-Win8.1 / FireFox 41.0.2。不知道“是否像往常一样开始上传过程”对我来说并不明显。.:-/
ScottWelker,2015年

2
哦! 等待!适用于Chrome 46.n-在“开始上传过程”之后。谢谢你的提示!
ScottWelker,2015年

1
我的文件夹中有20000个文件,并且通过拖放以及“单击以上传”选择所有文件时,上传不起作用。它仅适用于较小的图像子集(最多几百或几千个)。
Kristada673

这适用于小文件和文件夹,但是在一定大小之后,浏览器/界面将崩溃,因此最好使用下面的@Asad s解决方案
contool

@contool大声笑,为什么浏览器会崩溃?它将大文件拆分为数据包,然后按小部分发送。它永远不会将整个文件加载到内存中。我连续6年每周上传几GB的数据,从未崩溃,甚至没有一次。问题是关于浏览器中的AWS控制台,而不是CLI作为Asad的答案。
Kainax

124

我建议您使用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

4
该问题专门询问如何使用控制台执行此操作。
蒂姆·高铁

8
这是基于用户是否要将本地文件夹本身复制到s3或仅将该文件夹的内容复制到的。aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive不会导致的创建s3://DEST_BUCKET/SOURCE_DIR,但是大多数时候通常会自动创建此远程文件夹。
ely

我同意@ely,但不确定s3://DEST_BUCKET/SOURCE_DIRaws s3 cp命令中创建的正确方法是什么。我只是在s3存储桶上手动创建了一个具有相同名称的文件夹,然后将其递归复制到该文件夹​​中。
piedpiper


32

通常,我使用可通过AWS管理控制台使用的增强上传器。但是,由于这需要Java,因此可能会引起问题。我发现s3cmd是一个很好的命令行替代品。这是我的用法:

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

5

我在查找用于在S3中上传文件夹和子文件夹的增强的上传器工具时遇到问题。但是,除了找到工具之外,我还可以通过简单地将文件夹拖放到S3存储桶中来上传文件夹以及其中的子文件夹。

注意:此拖放功能在Safari中不起作用。我已经在Chrome中对其进行了测试,并且效果很好。

拖放

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

在此处输入图片说明


1
我在2015年6月给出了这个答案:)
Kainax

1
是的,您的答案很好。但是,当我在Safari中时,它不起作用。我必须使用Google Chrome才能使其正常运行。因此,我认为如果将整个过程放在图像上,其他开发人员将更容易获得即时帮助。希望你能理解。
Reaz Murshed

1

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


0

值得一提的是,如果仅使用S3进行备份,则应压缩该文件夹然后上传。这将节省您的上传时间和成本。

如果您不确定如何从终端进行有效的压缩,请在此处查看OSX。

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


0

我在这里看不到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


0

当我试图弄清楚这一点时,我到了这里。使用当前的版本,您可以将文件夹拖放到其中,并且可以正常工作,即使打开上传对话框时不允许您选择文件夹。




0

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


0

执行类似于以下命令的内容:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.