2010-01-25 7 views
0

J'ai une page de téléchargement de fichier avec un contrôle AsyncFileUpload. Lorsque l'utilisateur parcourt le fichier, le contrôle de téléchargement extrait le fichier en mémoire. J'ai alors un bouton Télécharger qui tire le code suivant pour enregistrer le fichier dans une base de données.Ajax AsyncFileUpload.FileBytes renvoie null

Je constate que si les fichiers dépassent environ 500 Ko, la propriété FileBytes du contrôle renvoie simplement null. Cela se passe sur mon serveur, mais lors de l'exécution de l'application localement, il fonctionne très bien.

Je ne gère pas l'événement OnUploadCompleted car j'ai besoin de l'utilisateur pour compléter d'autres informations avant de valider le fichier dans la base de données.

J'ai dans mon web.config: httpRuntime maxRequestLength = « 10000 » />

private void UploadDocument(int mietID) 
{ 
    if (Page.IsValid) 
    { 
     if (mietID > 0) 
     { 
      if (File1.HasFile && File1.FileBytes != null) 
      { 
       string[] docFormats = MIETPConfig.Current.SupportedDocumentFormats; 

       for (short i = 0; i < docFormats.Length; i++) 
        docFormats[i] = docFormats[i].ToUpper(); 

       if (docFormats.Contains(Path.GetExtension(File1.FileName).ToUpper())) 
       { 
        try 
        { 
         byte[] uploadedBytes = File1.FileBytes; 
         DocumentController.CreateDocument(txtLinkText.Text, Path.GetFileName(File1.PostedFile.FileName), uploadedBytes, mietID, (User)Session["User"]); 

         MietpClientScripts.CloseWindow(Page); 
        } 
        catch (Exception) 
        { 
         lblUploadStatus.Text = "There was an error saving the document to the database."; 
        } 
       } 
       else 
       { 
        System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
        foreach (string s in docFormats) 
         sb.Append(s + ", "); 

        sb.Remove(sb.Length - 2, 2); 
        lblUploadStatus.Text = "Invalid file format, only these formats are supported: " + sb.ToString(); 
       } 
      } 
      else 
      { 
       lblUploadStatus.Text = "There was an error saving the document, the document could not be read; it might be too large to upload."; 
      } 
     } 
     else 
      lblUploadStatus.Text = "No Mietp ID to associate document with."; 
    } 
} 

Répondre

2

Je ne suis pas tout à fait sûr, mais je peux imaginer que les octets max dans FileBytes est limitée en raison du fait que beaucoup de téléchargements de fichiers prendrait beaucoup de RAM. Votre partenaire d'hébergement pourrait avoir limité cela. Votre hébergeur a probablement défini le <httpRuntime maxRequestLength="XXX" /> à 512 Ko par défaut.

Essayez d'enregistrer le fichier en utilisant SaveAs(path). C'est essentiellement ce que vous faites à ce stade, mais vous laisserez le contrôle déterminer quand vider le fichier, évitant de prendre le fichier entier en mémoire, ou saisir le flux de fichiers en utilisant FileContent si vous avez vraiment besoin d'accéder au contenu brut . Remplacez également <httpRuntime maxRequestLength="XXX" /> par quelque chose comme 102400 pour remplacer les paramètres par défaut de votre hébergeur.

+0

Désolé, j'ai manqué cela de la poste - j'avais le maxRequestLength fixé à 10000, mais l'ai essayé avec 102400 maintenant. J'ai essayé d'utiliser le flux de FileContent mais la méthode read ne renvoie rien, bien que la propriété Length donne le nombre d'octets correct. File.SaveAs donne une ObjectDisposedException (impossible d'accéder à un fichier fermé) chaque fois que les FileBytes sont NULL. –

+0

Si vous venez de mettre: 'void UploadDocument() {File1.SaveAs (Server.MapPath (" ~/myuploadedfile.tmp ")); } ', au lieu de toute la logique maintenant; cela enregistre-t-il le fichier correctement? Sinon, cela fonctionne-t-il lorsque vous utilisez un 'FileUpload' normal au lieu de celui d'AJAX? –

+0

Non, le fichier ne sera pas sauvegardé même si j'ai supprimé la logique. J'ai fait un remplacement direct à un contrôle FileUpload et cela fonctionne très bien avec tous les documents, même un 15 Mo. –

2

Je pense que j'ai trouvé un correctif pour ce problème: dans l'événement OnUploadComplete, mettez simplement en session les FileBytes et récupérez-le dans votre événement Button_Click. Pour une raison quelconque, vos octets de fichier téléchargés sont effacés de la session après une seconde publication ...

Cela fonctionne pour moi. Vive Laurent

+0

Bonne suggestion - ça sonne comme si j'accomplissais ce que j'essayais de faire. Bien que je viens de script autour de l'ancien contrôle FileUpload maintenant. Je suppose que le danger est que le bouton pourrait être cliqué trop tôt, surtout avec un gros fichier, et la valeur serait toujours nulle; cela provoquerait aussi un postback donc ne serait jamais complet. –

2

Lorsque vous utilisez AsyncFileUpload vous devez définir les bonnes params dans la balise form, qui est placé dans votre ou MasterPage:

<form id="form1" runat="server" enctype="multipart/form-data" method="post"> 

Si vous ne définissez pas le droit enctype et méthode UploadedComplete ne tirera jamais, et vous ne pourrez pas obtenir FileUpload.FileBytes puisque FileUpload.HasFile renvoie true uniquement pendant l'exécution de UploadedComplete.

Je suppose que dans votre page vous n'avez pas défini le bon type. En outre, les versions précédentes d'AsyncFileUpload ne fonctionnaient pas sur Chrome. La version de juillet 2011 (4.1.50731.0) a résolu le problème.