在MVC 5中上传图像时,Request.Files.Count始终为0

时间:2014-03-16 10:59:50

标签: asp.net-mvc http-headers asp.net-mvc-5 asp.net-mvc-5.1 enctype

我在模型上有一个Post控制器,带有一些字符串字段和一个图像。完全相同的代码适用于MVC4,但在MVC 5中,Request.Files.Count始终为0

我的模型有图像的byte []而不是HttpPostedFileBase

我的观点:

@using (Html.BeginForm("Create", "HotelManager", FormMethod.Post, new { enctype = "multipart/form-data", data_ajax = "false" }))
{
    @Html.AntiForgeryToken()
    @Html.TextBoxFor(model => model.Title, new { @class = "form-control" })
    @Html.TextAreaFor(model => model.Description, new { @class = "form-control", @rows = "7" })
    <input type="file" class="form-control filestyle">
    <input type="submit" value="Submit" class="btn btn-block" />
}

我试过省略data_ajax =“false”但没有用。

我的帖子控制器如下:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Title,Description,Image")] Hotel hotel)
    {
        if (ModelState.IsValid)
        {
            // deal with the uploaded file
            if (Request.Files.Count > 0)
            {
                HttpPostedFileBase file = Request.Files[0];

                if (file != null && file.ContentLength > 0)
                {
                    // Code to process image, resize, etc goes here
                }
            }

        // Other code to add the hotel to db goes here
    }

在调试器中我看到Request.Files.Count总是为零,我不知道为什么? 我已经复制了另一个MVC4项目的视图和控制器代码,它可以正常工作。

Key Value
Request POST /HotelManager/Create HTTP/1.1
Accept  text/html, application/xhtml+xml, */*
Referer http://localhost:4976/HotelManager/Create
Accept-Language en-US,en;q=0.5
User-Agent  Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; ASU2JS; rv:11.0) like Gecko
Content-Type    multipart/form-data; boundary=---------------------------7de207070a24
Accept-Encoding gzip, deflate
Host    localhost:4976
Content-Length  946
DNT 1

在IE Developer窗口中,我看到表单正文为空。

4 个答案:

答案 0 :(得分:43)

我浪费了太多时间,事实证明我所需要做的就是使用name属性

 <input type="file" name="somename"> 

我的新项目中缺少name属性。

答案 1 :(得分:37)

您需要更改帖子方法

需要添加:

new { enctype = "multipart/form-data" }

这是完整的表单标记

@using (Html.BeginForm("Cars", "Expense", FormMethod.Post, 
      new { enctype = "multipart/form-data" }))

See how can you post multiple files

答案 2 :(得分:11)

添加 你需要改变post方法。

需要添加:

new { enctype = "multipart/form-data" }

这是完整的表单标记

@using (Html.BeginForm("Cars", "Expense", FormMethod.Post, 
      new { enctype = "multipart/form-data" }))

这些线条至关重要;没有它们,您将无法保存类型文件的输入。我坐了6个小时试图解决这个问题。

答案 3 :(得分:0)

上传图片时,我发现了一种情况。 如果要将图像存储在DBContext中并使用async-await调用任何API,则在调用任何API之前将Image保存在数据库中。否则Content-length变为0。我已经调试清楚,然后意识到了。我们需要在异步调用之前对数据库执行保存操作。 但是,文件输入类型和输入方法必须具有name属性,HTML beginform中必须要求enctype multipart / form-data。

另外,您可以尝试获取文件基础,

HttpPostedFileBase fileBase = Request.Files["file_name"];