是否有可能进行批量上传到Amazon S3?(Is it possible to perform a

2019-07-20 10:57发布

是否Amazon S3的支持批量上传? 我有一个需要上传的工作,每天晚上〜100K文件可以达到1G,但对小文件的强烈扭曲(90%小于100个字节,99%小于1000个字节长)的。

是否S3 API的支持在单个HTTP调用上传多个对象?

所有对象必须在S3可作为单独的对象。 我不能承载他们在其他地方(FTP等),或者以另一种格式(数据库,EC2本地驱动器等)。 这是我无法改变的外部需求。

Answer 1:

是否S3 API的支持在单个HTTP调用上传多个对象?

否, S3的PUT操作仅支持上传每HTTP请求一个对象。

你可以安装S3工具你的机器上要与远程斗同步,并运行以下命令:

s3cmd sync localdirectory s3://bucket/

然后,你可以在脚本中把这个命令,并创建计划作业每天晚上运行此命令。

这应该做你想要什么。

该工具执行基于了MD5散列,文件大小的文件同步,所以碰撞应该是罕见的(如果你真的想你可以只使用了“s3cmd把”命令来强制对象的盲覆盖在你的目标桶)。

编辑:另外,还要确保你读我联系了S3工具网站上的文档 - 有需要的您是否想在本地删除的文件,以从桶中被删除或忽略等不同的标志



Answer 2:

另外,您也可以通过上传S3 AWS CLI工具使用sync命令。

AWS S3同步local_folder S3://斗名

您可以使用此方法来批量上传文件至S3非常快。



Answer 3:

一个文件(或文件的一部分)=一个HTTP请求,但Java API现在支持高效的多文件上传,而无需编写多线程你自己,通过使用TransferManager



Answer 4:

如果你想使用Java程序来完成它,你可以这样做:

public  void uploadFolder(String bucket, String path, boolean includeSubDirectories) {
    File dir = new File(path);
    MultipleFileUpload upload = transferManager.uploadDirectory(bucket, "", dir, includeSubDirectories);
    try {
        upload.waitForCompletion();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

s3client和转让管理的创新,如果你想测试如下连接到本地S3:

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, token);
    s3Client = new AmazonS3Client(credentials); // This is deprecated but you can create using standard beans provided by spring/aws
    s3Client.setEndpoint("http://127.0.0.1:9000");//If you wish to connect to local S3 using minio etc...
    TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();


Answer 5:

要添加到每个人都在说,如果你希望你的Java代码(而不是CLI)来做到这一点,而不必把所有的文件在一个目录中,你可以创建一个文件列表上传,然后供应该列表中AWS TransferManager的uploadFileList方法。

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html#uploadFileList-java.lang.String-java.lang.String-java.io。文件java.util.List-



文章来源: Is it possible to perform a batch upload to amazon s3?