MVC 3中的文件上传问题/错误

时间:2011-09-12 19:00:27

标签: asp.net asp.net-mvc upload razor

我遇到了ASP.NET MVC 3中文件上传最奇怪的问题。当我使用Razor使用默认项目模板(Internet应用程序)启动一个新项目时,将以下内容添加到/views/home/index.cshtml

<form action="/Home/Index" method="post" enctype="multipart/form-data">
  <input type="file" name="upfile" />
  <input type="submit" value="post" />
</form>
每当我尝试上传文件时,上传失败(firebug显示状态'Aborted')。一些额外的信息:

  • Windows 7 / 64bit
  • 卡西尼
  • VS SP1
  • 它发生在Firebug 6.0.2和IE8

控制器代码:

public class HomeController : Controller {
    public ActionResult Index() {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About() {
        return View();
    }

}

我已经调试了一下,已经发现了以下内容:

  • 仅适用于文件&gt; 〜120KB
  • 如果我添加具有属性[HttpPost]上传成功的目标Action
  • 如果我使用fiddler(代理)上传调试成功
  • 如果我使用aspx并添加相同的代码,则上传成功
  • 对于aspx / razor,所有文件都是相同的,除了(当然)/ Views中的文件,但不是/Views/Web.config

有没有其他人遇到过这个问题,是什么导致了这个问题?

更新:我知道我应该使用单独的操作并用HttpPost标记它,这不是我问这个问题的原因。我正在寻找原因为什么这不起作用,而不是如何解决它。

3 个答案:

答案 0 :(得分:1)

没有看到你的代码,我假设你有一个HttpGet的方法你的默认/ home / index

你需要在某个地方发布,这不是你的控制器方法。你应该有一个单独的[HttpPost]方法(用于post / get / update / delete的独立控制器方法)

编辑澄清: 为您的帖子操作创建单独的方法。你不应该为get / post共享相同的方法。 您还要从帖子中返回一个视图。通常也不建议这样做,因为MVC期望PRG(重定向后获取)行为,因此理想情况下您希望在完成后重定向回动作。 此处也支持使用Post(以及网上的许多其他帖子)

File upload MVC

在上面的情况下,它可以正常工作,因为它没有验证,但如果你在文件上传之前在页面上有验证,如果你回发并且不重定向回动作就很容易变得愚蠢。

答案 1 :(得分:0)

强烈建议使用单独的操作来处理文件上传:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(HttpPostedFileBase upfile)
    {
        // TODO: process the uploaded file here
        if (upfile != null && upfile.ContentLength > 0) 
        {
            var fileName = Path.GetFileName(upfile.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
            upfile.SaveAs(path);
        }
        return RedirectToAction("Index");
    }
}

另外请务必查看following blog post

答案 2 :(得分:0)

您是否确定在Web.config中正确设置了MaxRequestStringLength?

当我遇到这个时,这通常是个问题。