web-dev-qa-db-fra.com

Téléchargement de fichiers avec ASP.Net MVC - obtenir le nom mais pas de flux de fichiers, que fais-je de mal?

J'ai ce formulaire à mon avis:

<!-- Bug (extra 'i') right here-----------v  -->
<!-- was: <form method="post" enctype="mulitipart/form-data" action="/Task/SaveFile"> -->
<form method="post" enctype="multipart/form-data" action="/Task/SaveFile">
<input type="file" id="FileBlob" name="FileBlob"/>
<input type="submit"  value="Save"/>
<input type="button" value="Cancel" onclick="window.location.href='/'" />
</form>

Et ce code dans mon contrôleur:

public ActionResult SaveFile( FormCollection forms )
{
   bool errors = false;
   //this field is never empty, it contains the selected filename
   if ( string.IsNullOrEmpty( forms["FileBlob"] ) )
   {
       errors = true;
       ModelState.AddModelError( "FileBlob", "Please upload a file" );
   }
   else
   {
      string sFileName = forms["FileBlob"];
      var file = Request.Files["FileBlob"];
      //'file' is always null, and Request.Files.Count is always 0 ???
      if ( file != null )
      {
         byte[] buf = new byte[file.ContentLength];
         file.InputStream.Read( buf, 0, file.ContentLength );
         //do stuff with the bytes
      }
      else
      {
         errors = true;
         ModelState.AddModelError( "FileBlob", "Please upload a file" );
      }
   }
   if ( errors )
   {
      return ShowTheFormAgainResult(); 
   }
   else
   {
      return View();
   }
}

Sur la base de chaque exemple de code que j'ai pu trouver, cela semble être la façon de le faire. J'ai essayé avec des fichiers petits et gros, sans aucune différence dans le résultat. Le champ de formulaire contient toujours le nom de fichier qui correspond à ce que j'ai choisi et la collection Request.Files est toujours vide.

Je ne pense pas que ce soit pertinent, mais j'utilise le serveur Web de développement VS. AFAIK, il prend en charge les téléchargements de fichiers de la même manière que IIS.

Il se fait tard et il y a une chance que je manque quelque chose d'évident. Je serais reconnaissant pour tout conseil.

41
Jason Diller

Je ne sais pas quelle est la politique sur la publication de blasphèmes, mais voici le problème:

enctype="mulitipart/form-data"

L'extra i là-dedans a empêché le téléchargement du fichier. J'ai dû exécuter Fiddler pour voir qu'il n'envoyait jamais le fichier en premier lieu.

Il devrait se lire:

enctype="multipart/form-data"
50
Jason Diller

Pour les personnes qui pourraient tomber sur ce message à l'avenir, voici un excellent article de Scott Hanselman sur le sujet: ne étude de cas de retour aux sources: Implémentation du téléchargement de fichiers HTTP avec ASP.NET MVC, y compris des tests et des simulations =

16
Jason
var file = Request.Files[sFileName];

devrait être...

var file = Request.Files["FileBlob"];

cela dit, Request.Files.Count devrait être 1 ... hmmm

2
Pure.Krome

Heureusement que vous avez trouvé votre erreur.

En guise de remarque, vous voudrez essayer/attraper le code de gestion des fichiers afin de savoir quand les autorisations de fichiers, etc. ne sont pas configurées correctement.

0
Todd Smith