使用ASP.net MVC将大文件上传到s3

时间:2011-01-31 04:55:22

标签: asp.net-mvc amazon-s3

Stack Overflow上有很多类似的问题,但是我无法通过MVC.net将大文件上传到S3。

基于aws .net sdk示例和其他一些答案,我有以下内容:

public static void UploadToS3(System.IO.Stream stream, string bucketName, string keyName, bool asAttachement)
    {
        AmazonS3 client;
        string accessKey = Settings.ApplicationSettings.AccessKeyID;
        string secretKey = Settings.ApplicationSettings.SecretAccessKeyID;
        // This config ensures s3 works in medium trust.
        AmazonS3Config s3config = new AmazonS3Config();
        s3config.UseSecureStringForAwsSecretKey = false;
        using (client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, s3config))
        {
            try
            {
                PutObjectRequest request = new PutObjectRequest();
                request.WithBucketName(bucketName)
                    .WithKey(keyName)
                    .WithInputStream(stream);


                if (asAttachement)
                {
                    // add headers to ensure asset is downloaded, not opened in browser.
                    request.AddHeaders(Amazon.S3.Util.AmazonS3Util.CreateHeaderEntry("Content-Disposition", "attachment"));
                }

                S3Response response = client.PutObject(request);
                response.Dispose();
            }
            catch(Exception ex)
            {
                throw new ApplicationException("Unable to upload asset." + ex.Message);
            }
        }
    }

Web应用程序与小文件完美配合,大型文件将上传到站点(托管Rackspace Cloud Sites),但浏览器在http帖子后大约30秒后超时,这不足以上传流到亚马逊。浏览器因未收到服务器的响应而超时。

我需要做些什么来使这个工作适用于大文件,或者我应该如何将文件上传到S3?

1 个答案:

答案 0 :(得分:1)

从它的声音来看,你有3个系统参与其中。有一个运行Web浏览器的客户端,有您的服务器,还有S3。据我了解您的情况,客户端向您的服务器发出请求,导致您的服务器将文件上传到S3。你提到浏览器抱怨服务器没有响应。这可能是因为您的服务器忙于将文件上传到S3。当您的服务器将对象上载到S3时,它不会向浏览器发送任何状态更新。如果上传时间足够长,浏览器将放弃等待。这并不意味着上传没有发生,只是浏览器停止等待服务器响应。您需要做的是将一些增量结果返回给客户端。我不是.Net程序员,但我可能会做的是生成一个新线程来执行上传,并在请求线程上返回一些初始内容,指示请求正在进行,刷新响应但不关闭输出。当有一个等待上传线程的循环时,每隔5秒唤醒一次以写入空格字符并将其刷新到客户端。这将使浏览器不会超时。