2008-11-18 5 views
41

Je cette forme à mon avis:Téléchargement de fichiers avec ASP.Net MVC - obtenir le nom, mais pas de flux de fichier, qu'est-ce que je fais mal?

<!-- 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 échantillon de code que je suis en mesure de trouver, cela semble être le chemin fais le. J'ai essayé avec des fichiers petits et grands, sans 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 VS Development Web Server. AFAIK il supporte les téléchargements de fichiers les mêmes 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.

+0

Référez http://stackoverflow.com/questions/9411563/asp-net-mvc3 -razz-fichier-upload-donne-zero-as-file-count pour un problème connexe – Lijo

Répondre

50

Je ne sais pas ce que la politique est sur l'affichage grossièretés, mais est ici la problème:

enctype="mulitipart/form-data" 

le i supplémentaire là arrêté le fichier de téléchargement. J'ai dû lancer Fiddler pour voir qu'il n'envoyait jamais le fichier en premier lieu.

Il faut lire:

enctype="multipart/form-data" 
+0

HAHA :) j'ai raté ça! bon travail! Peut-être que vous pouvez mettre à jour le fond de votre message initial en mentionnant la solution et en marquant votre propre réponse, etc. –

+0

Ou peut-être mettre à jour le code, afin que les gens copier-coller le premier exemple au moins obtenir le bon code. –

+2

J'ai déjà eu ce problème deux fois en raison de copier-coller l'enctype de ce post! –

2
var file = Request.Files[sFileName]; 

devrait être ...

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

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

+0

Changé et a essayé de nouveau pour être sûr mais pas de changement. Request.Files ["FileBlob"] renvoie également null. Request.Files.Count est toujours 0. Je vais modifier l'exemple de code pour clarifier. –

0

Bien que vous avez trouvé votre erreur.

En guise de remarque, vous voudrez essayer/rattraper le code de gestion de fichiers pour savoir quand les permissions de fichier, etc., ne sont pas configurées correctement.

+0

En fait, je ne touche pas au système de fichiers. Le fichier est stocké dans une base de données. Mais merci. –