2010-12-06 4 views
2

J'ai créé le projet mvc et je souhaite télécharger le fichier. Je me suis inscrit dans le web.configTélécharger le fichier mvc avec httpRuntime maxRequestLength

<httpRuntime maxRequestLength="2000"/> 
<customErrors mode="On" redirectMode="ResponseRedirect" defaultRedirect="address here"> </ customErrors>, in Index.aspx <% using (Html.BeginForm ("upload", "home", FormMethod.Post, 
    new {enctype = "multipart/form-data"})) {%> 
    <label for="file"> Filename: </ label> 
    <input type="file" name="file" id="file" /> 

    <input type="submit" /> 
<%}%> 

Dans HomeController.cs

[HttpPost] 
public ActionResult Upload (HttpPostedFileBase file) 
{ 
    if (file! = null & & file.ContentLength> 0) 
    { 
     if (file.ContentLength> 4096000) 
     { 
      return RedirectToAction ("FileTooBig"); 
     } 
     var fileName = Path.GetFileName (file.FileName); 
     var path = Path.Combine (Server.MapPath ("~/App_Data/uploads"), fileName); 
     file.SaveAs (path); 
    } 
    return RedirectToAction ("Index"); 
} 

Si je joindre des fichiers de plus de 2 méga-octets defaultRedirect fonctionne parfaitement dans Opera, mais ne fonctionne pas dans Chrome et IE. J'ai également utilisé Response.Redirect ("address here") dans l'événement Application_Error() dans global.asax. Cela ne fonctionne pas non plus dans Chrome et IE. Que devrais-je faire?

Répondre

1

La valeur maxRequestLength est exprimée en kilo-octets (Ko). Vous avez le vôtre réglé à 2000KB (ce qui est légèrement inférieur à 2MB car il y a 1024KB dans 1MB). Je ne suis pas sûr pourquoi il fonctionne dans certains navigateurs et pas d'autres, à moins que certains ne compriment tout le contenu du téléchargement et d'autres ne le sont pas (ce que je crois est supporté par HTTP 1.1).

HTH, Brian

1

essayer. Cet extrait a été testé et a fonctionné comme prévu. À l'avenir, essayez de ne pas utiliser var type pour la variable de chaîne. var est un type dynamique et devrait fonctionner pour tous les types de fichiers - y compris array. Mais essayez d'être spécifique avec le type de fichier aidera à réduire les erreurs.

Je conserve normalement mes fichiers publics dans un dossier public. Alors, changez-le dans votre dossier (par exemple App_Data)

[HttpPost] 
public ActionResult test(HttpPostedFileBase file) 
{ 
    if (file.ContentLength> 4096000) 
     { 
      return RedirectToAction ("FileTooBig"); 
     } 

    string fileName = Path.GetFileName(file.FileName); 
    string uploadPath = Server.MapPath("~/Public/uploads/" + fileName); 

    file.SaveAs(uploadPath); 
    return View("Index"); 
} 

Bonne chance

+0

Je dois vérifier la taille du fichier avant de le télécharger. Je peux le faire dans l'événement Application_BeginRequest dans Global.asax, mais comment annuler le fichier de téléchargement si la taille est supérieure à ma variable maxFileSize? Si j'utilise Redirect dans cet événement, le fichier est d'abord chargé, puis fonctionne Redirect. – Stwr

+0

Vous ne pouvez pas vérifier un fichier sans demande http. Notez que [httpPost] au-dessus de la méthode actionresult nécessite une entrée de soumission. Une fois soumis, httpPostFileBase est en attente de traitement. Maintenant, vous pouvez utiliser votre logique pour faire ce que vous voulez avec le fichier. – Jack

+0

Je peux vérifier la taille du fichier avant de le télécharger dans l'événement Application_BeginRequest() AVANT que le fichier ne soit téléchargé. Si j'utilise [HttpPost] public ActionResult functionName(), le fichier sera entièrement téléchargé et je pourrai vérifier la taille du fichier. La deuxième option est mauvaise pour ce projet. Mais je ne sais pas comment annuler le fichier de téléchargement si la taille est supérieure à ma variable maxFileSize (première option). – Stwr

0

Puis essayez d'utiliser le si-la-else. Cet extrait fonctionne. Si vous l'aimez, votez moi.

[HttpPost] 
public ActionResult test(HttpPostedFileBase file) 
{ 
    if (file.ContentLength > 400) 
    { 
     return RedirectToAction("GeneralError", "Error"); 
    } 
    else 
    { 
     string fileName = Path.GetFileName(file.FileName); 
     string uploadPath = Server.MapPath("~/Public/uploads/" + fileName); 

     file.SaveAs(uploadPath); 
     return View("Index"); 
    } 
} 

deux touches d'entrée nécessaires: Pour naviguer sur le fichier: Pour soumettre le fichier:

Bonne chance!

1

Il n'y a aucun moyen d'empêcher le téléchargement du fichier. IIS reçoit le corps entier de la requête HTTP avant de le transmettre à la pile ASP.NET. Cela inclut toutes les parties de votre message en plusieurs parties. Pour cette raison, ASP.NET n'a vraiment aucune chance d'interrompre le téléchargement d'un fichier en vérifiant la propriété file.ContentLength.

Vous pouvez écrire un module HTTP personnalisé pour vérifier la taille du fichier, mais l'annulation ou la fermeture de la réponse avant la réception de la requête entière entraîne une réponse vide. Ce qui signifie qu'il n'y a aucun moyen d'échouer gracieusement. Ma suggestion serait faire votre fichier upload dans un iframe caché lors de l'implémentation du module HTTP. De cette façon, si quelque chose ne va pas, votre page principale ne se cassera pas.

Tout le monde peut se joindre à moi pour remercier Microsoft pour cette superbe fonctionnalité (file d'attente dans le sarcasme).

Merci Microsoft. Merci.

+0

Vous ne savez pas si vous avez trouvé une solution ou une solution de contournement pour cela. Mais avez-vous découvert que vous ne pouvez pas annuler le transfert de fichier? Ce n'est tout simplement pas possible avec IIS. –

Questions connexes