2011-01-31 41 views
0

Stack Overflow有很多類似的問題,但是我在通過MVC.net上傳一個大文件到S3上時遇到了問題。用ASP.net將大文件上傳到s3 MVC

基於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 post後大約30秒後超時,這個時間不夠長,無法將流上傳到Amazon。瀏覽器超時沒有收到服務器的響應。

我需要做些什麼才能使這項工作適用於大文件,或者我應該如何將文件上傳到S3?

回答

1

從它的聲音,你有3個系統涉及到這一點。有一個客戶端運行一個Web瀏覽器,有你的服務器,並有S3。據我瞭解你的情況,客戶端對你的服務器發出請求,導致你的服務器上傳一個文件到S3。你提到瀏覽器正在抱怨服務器沒有響應。這可能是因爲您的服務器正忙於將文件上傳到S3。當您的服務器將對象上傳到S3時,它不會向瀏覽器發送任何狀態更新。如果上傳時間足夠長,瀏覽器將放棄等待。這並不意味着上傳不會發生,只是瀏覽器停止等待您的服務器響應。你需要做的是將某種增量結果返回給客戶端。我不是.Net程序員,但我可能會做的是產生一個新的線程來執行上傳,並在請求線程返回一些初始內容,指示請求正在進行,刷新該響應但不關閉輸出。當有一個等待上傳線程的循環時,每5秒喚醒一次寫入空格字符並將其刷新到客戶端。這將阻止瀏覽器超時。

+0

這是正確的,謝謝你的反饋。到Rackspace Cloud站點的客戶端正常工作,但從Rackspace卸載到S3所涉及的時間會導致瀏覽器問題。在超時之前,Chrome只允許大約30秒的傳輸。我目前正在將文件上傳到主機,保存到文件系統和數據庫,並嘗試運行某種後臺線程以轉移到S3。這適用於小文件,但仍然對大文件(30-50MB)有問題。我原以爲這是一個普遍的任務,並且在.net域會有一些樣本。 – Adrian 2011-02-02 04:19:38