41 votes

Le téléchargement de Fichiers avec ASP.Net MVC - obtenir le nom, mais pas de fichier de flux, ce que je fais mal?

J'ai cette forme de mon point de vue:

<!-- 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='http://stackoverflow.com/'" />
</form>

Et ce code dans mon controller:

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

En fonction de chaque exemple de code que j'ai pu trouver, cela semble être la façon de le faire. J'ai essayé avec de petits et de gros fichiers, avec 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 de la Demande.Les fichiers de la collection est toujours vide.

Je ne pense pas que c'est pertinent, mais je suis en utilisant le VS Serveur Web de Développement. Autant que je sache, il prend en charge les téléchargements de fichiers le même que IIS.

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

51voto

Jason Diller Points 2566

Je ne sais pas ce que la politique est sur le détachement des grossièretés, mais voici le problème:

enctype="mulitipart/form-data"

Les extra - i y arrêté le fichier de téléchargement. Eu à exécuter un violon pour voir qu'il n'a jamais été d'envoyer le fichier en premier lieu.

Il faut lire:

enctype="multipart/form-data"

16voto

Jason Points 1682

Pour les personnes qui pourraient tomber sur ce post à l'avenir, ici, un grand poste de Scott, Hanselman sur le sujet: Un Retour Aux Bases de l'Étude de Cas: la mise en Œuvre de HTTP Upload de Fichier avec ASP.NET MVC, y compris des Tests et se moque de

2voto

Pure.Krome Points 28473
var file = Request.Files[sFileName];

devrait être...

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

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

0voto

Todd Smith Points 8297

Bien que vous avez trouvé votre erreur.

Comme une note de côté, vous aurez besoin d'un try/catch autour de la gestion des fichiers de code de sorte que vous savez quand les autorisations de fichier, etc. ne sont pas correctement paramétré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X