使用httpRuntime maxRequestLength上传mvc文件

时间:2010-12-06 17:59:01

标签: c# asp.net-mvc

我创建了mvc项目并希望上传文件。我在web.config中注册了

<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中也不起作用。我该怎么办?

4 个答案:

答案 0 :(得分:1)

maxRequestLength以千字节(KB)为单位。您的设置为2000KB(略小于2MB,因为1MB中有1024KB)。

我不确定为什么它在某些浏览器而不是其他浏览器中运行,除非有些正在压缩整个上传内容而其他浏览器没有(我认为HTTP 1.1支持)。

HTH, 布赖恩

答案 1 :(得分: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");
}
祝你好运

答案 2 :(得分:1)

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

您可以编写自定义HTTP模块来检查文件大小,但在接收整个请求之前中止或关闭响应会导致响应为空。意思是没有办法优雅地失败。

我的建议是在实现HTTP模块时将文件上传到隐藏的iframe中。这样一来,如果出现问题,你的主页就不会破坏。

每个人都可以和我一起感谢微软这个令人敬畏的“功能”(在讽刺中排队)。

感谢微软。感谢。

答案 3 :(得分:0)

然后尝试使用if-the-else。这个片段有用。如果你喜欢,请投票给我。

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

需要两个输入按钮: 用于浏览文件: 提交文件:

祝你好运!