2011-01-31 30 views
0

スタックオーバーフローに関してよく似た質問がありますが、大きなファイルを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); 
      } 
     } 
    } 

をウェブアプリは小さなファイルで完璧に動作し、大きなファイルをサイトにアップロードされます(でホストされていますRackspace Cloud Sites)、ブラウザは、HTTPポストから約30秒後にタイムアウトします。これは、ストリームをAmazonにアップロードするのに十分ではありません。ブラウザは、サーバーからの応答を受信しないとタイムアウトします。

このファイルを大容量ファイルで使用するにはどうすればよいですか?また、ファイルをS3にアップロードするにはどうすればよいですか?

答えて

1

この音には3つのシステムがあります。 Webブラウザを実行しているクライアント、サーバーがあり、S3があります。私があなたのシナリオを理解しているように、クライアントはサーバーに対して要求を行い、サーバーにファイルをS3にアップロードさせます。あなたは、ブラウザがサーバーが応答していないと不平を言っていると言います。これはおそらく、サーバーがS3にファイルをアップロード中であるためです。サーバーがオブジェクトをS3にアップロードしている間は、ステータスの更新はブラウザに送信されません。アップロードに時間がかかりすぎると、ブラウザは待っています。これはアップロードが行われなかったことを意味するものではなく、サーバーが応答するのをブラウザが待つのを止めただけです。あなたがする必要があるのは、何らかの増分的な結果をクライアントに返すことです。私は.Netのプログラマーではありませんが、私はおそらく、アップロードを行うために新しいスレッドを生成し、リクエストスレッドが要求が進行中であったことを示すいくつかの初期コンテンツを返し、その応答をフラッシュしますが、出力を閉じません。アップロードスレッドを待っているループがあるときに、5秒ごとに目覚めて空白文字を書き、それをクライアントにフラッシュします。これにより、ブラウザのタイムアウトが回避されます。

+0

フィードバックに感謝します。 Rackspace Cloudサイトへのクライアントは正常に動作しますが、RackspaceからS3にオフロードする時間はブラウザの問題を引き起こします。クロムは、タイムアウト前にこの転送に約30秒しかかかりません。私は現在、ホストにファイルをアップロードしています。ファイルシステムとdbに保存し、S3に転送するバックグラウンドスレッドを実行しようとしています。これは小さなファイルでは機能していますが、まだ大きなファイル(30〜50MB)には問題があります。私はこれが普通の仕事だと思っていたでしょうし、ネットの土地にいくつかのサンプルがあります。 – Adrian

関連する問題