2010-12-06 44 views
2

我创建了mvc项目并希望上传文件。我在web.config带有httpRuntime的mvc文件上传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" /> 
<%}%> 

登记在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"); 
} 

如果我附加文件超过2兆字节的defaultRedirect完美的作品在Opera,但在Chrome和IE浏览器无法正常工作。我还在Global.asax的Application_Error()事件中使用了Response.Redirect(“address here”)。它也不适用于Chrome和IE。我该怎么办?

回答

1

maxRequestLength的是在千字节(KB)。您的设置为2000KB(略低于2MB,因为1MB中有1024KB)。

我不知道为什么它工作在某些浏览器,而不是别人,除非是一些正在压缩的整个上载内容和其他人都没有(我相信是支持HTTP 1.1)。

HTH, 布赖恩

1

试试这个。这段代码已经过测试并按预期工作。将来不要使用var类型作为字符串变量。 var是一个动态类型,应该适用于所有文件类型 - 包括数组。但尝试具体的文件类型将有助于减少错误。

我通常保持公共文件夹中的我的公开文件中。因此,将其更改为您的文件夹(如程序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"); 
} 

好运

+0

我需要在上传前检查文件大小。我可以在Global.asax中的Application_BeginRequest事件中做到这一点,但如果size大于我的变量maxFileSize,如何取消下载文件?如果我在此事件中使用重定向,则首先加载文件,然后再重定向。 – Stwr 2010-12-06 18:55:24

+0

如果没有http请求,则无法检查文件。注意actionResult方法之上的[httpPost]需要提交输入。一旦提交,httpPostFileBase正在等待处理。现在,您可以使用自己的逻辑对文件进行任何操作。 – Jack 2010-12-06 19:52:06

0

然后尝试使用,如果最别人。此片段有效。如果你喜欢它,给我投票。需要

[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"); 
    } 
} 

两个输入按钮: 对于浏览文件: 提交文件:

祝您好运!

1

无法阻止文件上传。 IIS在将它传递给ASP.NET堆栈之前接收整个HTTP请求主体。这包括您的多部分表单帖子的所有部分。由于这个ASP.NET确实没有机会通过检查file.ContentLength属性来中断文件上传。

可以编写自定义HTTP模块查询的文件大小,但中止或关闭在一个空的响应接收到整个请求结果之前的响应。意味着没有办法优雅地失败。

我的建议是做这样的文件上传在一个隐藏的iframe,同时实现HTTP模块。这样,如果出现问题,您的主页不会中断。

每个人都可以与我一起感谢微软为这真棒“功能”(在讽刺队列)。

谢谢微软。谢谢。