gpt4 book ai didi

.net - 如何将大于 5 MB(大约)的文件上传到 Amazon S3(官方 SDK)?

转载 作者:行者123 更新时间:2023-12-03 07:48:35 24 4
gpt4 key购买 nike

我正在使用最新版本的官方 Amazon S3 SDK (1.0.14.1) 来创建备份工具。到目前为止,如果我上传的文件大小低于 5 MB,则一切正常,但当任何文件大于 5 MB 时,上传会失败,并出现以下异常:

System.Net.WebException: The request was aborted: The request was canceled. ---> System.IO.IOException: Cannot close stream until all bytes are written. at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) --- End of inner exception stack trace --- at Amazon.S3.AmazonS3Client.ProcessRequestError(String actionName, HttpWebRequest request, WebException we, HttpWebResponse errorResponse, String requestAddr, WebHeaderCollection& respHdrs, Type t) at Amazon.S3.AmazonS3Client.Invoke[T](S3Request userRequest) at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) at BackupToolkit.S3Module.UploadFile(String sourceFileName, String destinationFileName) in W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 88 at BackupToolkit.S3Module.UploadFiles(String sourceDirectory) in W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 108

注意:5 MB 大致是失败的边界,可以稍低或更高

我假设连接超时并且在文件上传完成之前流自动关闭。

我尝试找到一种设置较长超时的方法(但我在 AmazonS3AmazonS3Config 中找不到该选项)。

关于如何增加超时的任何想法(例如我可以使用的应用程序范围设置)或者它与超时问题无关吗?

<小时/>

代码:

var s3Client = AWSClientFactory.CreateAmazonS3Client(AwsAccessKey, AwsSecretKey);

var putObjectRequest = new PutObjectRequest {

BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true
};

using (var upload = s3Client.PutObject(putObjectRequest)) { }

最佳答案

更新的答案:

我最近更新了我的一个使用 Amazon AWS .NET SDK 的项目(至版本 1.4.1.0),在此版本中,有两项改进在我编写原始答案时并不存在在这里。

  1. 您现在可以将 Timeout 设置为 -1,为 put 操作设置无限的时间限制。
  2. 现在,PutObjectRequest 上有一个名为 ReadWriteTimeout 的额外属性,可以将其设置为(以毫秒为单位)在流读/写级别上超时,而不是整个 put 操作级别。

所以我的代码现在看起来像这样:

var putObjectRequest = new PutObjectRequest {

BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true,
Timeout = -1,
ReadWriteTimeout = 300000 // 5 minutes in milliseconds
};

原始答案:

<小时/>

我设法找出答案......

在发布问题之前,我探索了 AmazonS3AmazonS3Config,但没有探索 PutObjectRequest

PutObjectRequest内部有一个Timeout属性(以毫秒为单位设置)。我已经成功地使用它来上传较大的文件(注意:将其设置为 0 不会消除超时,您需要指定正数的毫秒数...我已经上传了 1 小时)。

这工作正常:

var putObjectRequest = new PutObjectRequest {

BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true,
Timeout = 3600000
};

关于.net - 如何将大于 5 MB(大约)的文件上传到 Amazon S3(官方 SDK)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com