我根据以下示例代码实现了 S3 多部分上传,包括高级和低级版本 http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?HLuploadFileJava.html 和 http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?llJavaUploadFile.html
当我上传小于 4 GB 的文件时,上传过程顺利完成。当我上传 13 GB 的文件时,代码开始显示 IO 异常、管道损坏。重试后,仍然失败。
以下是重现该场景的方法。以 1.1.7.1 版本为例,
- 在美国标准区域创建新的存储桶
- 创建一个大型 EC2 实例作为客户端上传文件
- 在 EC2 实例上创建一个大小为 13GB 的文件。
- 在 EC2 实例的高级或低级 API S3 文档页面之一上运行示例代码
- 测试三个部分大小中的任一个:默认部分大小(5 MB)或将部分大小设置为 100,000,000 或 200,000,000 字节。
到目前为止,问题一直存在。我在这里附上了一个 tcpdump 文件供您比较。在那里,S3 端的主机不断重置套接字。
答案1
虽然这是 c# 代码,但它显示了我用来成功复制最大 15GB 文件的超时和部分大小设置。也许需要将 AutoCloseStream 设置为 false。
using (FileStream fileStream = File.OpenRead(file.FullName))
{
TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
{
AutoCloseStream = false,
Timeout = 1200000,
BucketName = Settings.Bucket,
Key = file.Name,
InputStream = fileStream,
PartSize = 6291456 // 6MB
};
Console.Write("{0}...", file.Name);
Begin();
tu.Upload(request);
End();
Console.WriteLine("Done. [{0}]", Duration());
}