首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将文件上传到大于5MB(大约)的Amazon (官方SDK)?

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

Stack Overflow用户
提问于 2010-10-06 10:11:35
回答 5查看 28.6K关注 0票数 38

我正在使用官方Amazon的最新版本(1.0.14.1)来创建备份工具。到目前为止,如果我要上传的文件的大小小于5MB,那么所有内容都能正常工作,但是当任何文件都超过5MB时,上传就会失败,只有以下例外:

System.Net.WebException:请求被中止:请求被取消。-> System.IO.IOException:在写入所有字节之前不能关闭流。在System.Net.ConnectStream.CloseInternal(Boolean internalCall,布尔中止)-内部异常堆栈跟踪的结束-在Amazon.S3.AmazonS3Client.ProcessRequestError(String actionName、HttpWebRequest请求、WebException we、HttpWebResponse errorResponse、String requestAddr、WebHeaderCollection& respHdrs、Type t( Amazon.S3.AmazonS3Client.InvokeT at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) at BackupToolkit.S3Module.UploadFile(String sourceFileName )时W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 88 at BackupToolkit.S3Module.UploadFiles(String sourceDirectory)中W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 108中的字符串destinationFileName)

注意事项:5MB大致是故障的边界,它可以稍微低一点,也可以更高一些。

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

我试图找到一种设置长超时的方法(但我在AmazonS3AmazonS3Config中都找不到这个选项)。

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

代码:

代码语言:javascript
运行
复制
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)) {  }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-06 10:24:52

最新答案:

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

现在,您可以将operation.

  • There设置为-1,使其具有无限的时间限制。put 现在是PutObjectRequest上的一个额外属性,称为ReadWriteTimeout,可以设置(毫秒)在流读/写入级别上的超时,而不是整个put操作级别。

所以我的代码现在看起来如下:

代码语言:javascript
运行
复制
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并不会删除超时,您需要指定一个正数毫秒.我已经走了一个小时了。

这样做很好:

代码语言:javascript
运行
复制
var putObjectRequest = new PutObjectRequest {

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

Stack Overflow用户

发布于 2012-04-02 06:58:53

我一直有类似的问题,并开始使用TransferUtility类来执行多部分上传。

目前,这段代码正在工作。但是,当超时设置得太低时,我确实遇到了问题!

代码语言:javascript
运行
复制
                var request = new TransferUtilityUploadRequest()
                .WithBucketName(BucketName)
                .WithFilePath(sourceFile.FullName)
                .WithKey(key)
                .WithTimeout(100 * 60 * 60 * 1000)
                .WithPartSize(10 * 1024 * 1024)
                .WithSubscriber((src, e) =>
                {
                    Console.CursorLeft = 0;
                    Console.Write("{0}: {1} of {2}    ", sourceFile.Name, e.TransferredBytes, e.TotalBytes);
                });
            utility.Upload(request);

当我输入这个,我有一个4GB的上传发生,它已经通过了比以往任何时候!

票数 10
EN

Stack Overflow用户

发布于 2015-07-13 10:44:58

AWSSDKfor.NET有两个主要的API与Amazon 3一起工作。

1.低级API :

AmazonS3Client是一个名为

的客户端对象,它为S3公开的每个服务操作实现IAmazonS3 interface.It包含方法。

命名空间:Amazon.S3,Amazons.3.模型

代码语言:javascript
运行
复制
// Step 1 : 
AmazonS3Config s3Config = new AmazonS3Config();
s3Config.RegionEndpoint = GetRegionEndPoint();

// Step 2 :
using(var client = new AmazonS3Client(My_AWSAccessKey, My_AWSSecretKey, s3Config) )
{
    // Step 3 :
    PutObjectRequest request = new PutObjectRequest();
    request.Key = My_key;
    request.InputStream = My_fileStream;
    request.BucketName = My_BucketName;

    // Step 4 : Finally place object to S3
    client.PutObject(request);
}

2. TransferUtility : (我建议使用此API)

TransferUtility运行在底层API之上.对于将对象放入S3并将其放入S3中,它是一个简单的接口,用于处理S3最常见的用途。最大的好处在于放置物体。例如,TransferUtility检测文件是否很大,并切换到多部分上载模式。

命名空间:Amazon.S3.Transfer

代码语言:javascript
运行
复制
// Step 1 : Create "Transfer Utility" (replacement of old "Transfer Manager")
TransferUtility fileTransferUtility =
     new TransferUtility(new AmazonS3Client(Amazon.RegionEndpoint.USEast1));

// Step 2 : Create Request object
TransferUtilityUploadRequest uploadRequest =
    new TransferUtilityUploadRequest
    {
        BucketName = My_BucketName,
        FilePath = My_filePath, 
        Key = My_keyName
    };

// Step 3 : Event Handler that will be automatically called on each transferred byte 
uploadRequest.UploadProgressEvent +=
    new EventHandler<UploadProgressArgs>
        (uploadRequest_UploadPartProgressEvent);

static void uploadRequest_UploadPartProgressEvent(object sender, UploadProgressArgs e)
{    
    Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
}

// Step 4 : Hit upload and send data to S3
fileTransferUtility.Upload(uploadRequest);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3871430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档