2011-01-31 10 views
0

Il y a beaucoup de questions similaires sur Stack Overflow, mais je n'arrive pas à télécharger un gros fichier sur S3 via MVC.net.Télécharger des fichiers volumineux sur s3 avec ASP.net MVC

Sur la base des SSFE .net exemples sdk, et d'autres réponses, je donne les résultats suivants:

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); 
      } 
     } 
    } 

L'application Web fonctionne parfaitement avec les petits fichiers et des fichiers volumineux téléchargera sur le site (hébergé par Rackspace Cloud Sites), mais le navigateur expire après environ 30 secondes après le post http, ce qui n'est pas suffisant pour télécharger le flux sur Amazon. Le navigateur expire car il ne reçoit pas de réponse du serveur.

Que dois-je faire pour que cela fonctionne pour les gros fichiers, ou comment télécharger un fichier sur S3?

Répondre

1

Du son de cela, vous avez 3 systèmes impliqués dans cela. Il y a un client qui exécute un navigateur Web, il y a votre serveur et il y a S3. Si je comprends votre scénario, le client fait une demande contre votre serveur, entraînant votre serveur à télécharger un fichier sur S3. Vous mentionnez que le navigateur se plaint que le serveur ne répond pas. C'est probablement parce que votre serveur est occupé à télécharger le fichier sur S3. Pendant que votre serveur télécharge l'objet sur S3, il n'envoie aucune mise à jour d'état au navigateur. Si le téléchargement prend assez de temps, le navigateur abandonnera l'attente. Cela ne signifie pas que le téléchargement n'a pas eu lieu, mais que le navigateur a arrêté d'attendre que votre serveur réponde. Ce que vous devez faire est de renvoyer une sorte de résultat incrémental au client. Je ne suis pas un programmeur .Net, mais ce que je ferais probablement est de générer un nouveau thread pour faire le téléchargement, et sur le thread de demande retourner un contenu initial indiquant que la demande était en cours, vider cette réponse mais pas fermer la sortie . Lorsque vous avez une boucle qui a attendu le fil de téléchargement, se réveiller toutes les 5 secondes à l'écriture d'un caractère espace et le vidage au client. Cela empêchera le navigateur d'expirer.

+0

C'est vrai, et merci pour vos commentaires. Le client du site Rackspace Cloud fonctionne bien, mais le temps nécessaire pour décharger vers S3 à partir de Rackspace provoque le problème du navigateur. Chrome permet seulement environ 30 secondes pour ce transfert avant l'expiration. Je suis en train de télécharger des fichiers sur l'hôte ok, en enregistrant dans le système de fichiers et en DB et en essayant d'exécuter une sorte de thread d'arrière-plan pour transférer vers S3. Cela fonctionne pour les petits fichiers, mais le problème persiste sur les grands fichiers (30 à 50mb). J'aurais pensé que c'était une tâche commune, et il y aurait quelques échantillons là-bas dans les terres .net. – Adrian

Questions connexes