使用C#和MVC3的HttpFileCollectionBase问题上传多个文件

时间:2012-02-29 14:04:34

标签: c# asp.net asp.net-mvc-3

我创建了一个保存文件的控制器。

以下代码是该控制器的一部分:

if ( Request.Files.Count != 0 ) {
      HttpFileCollectionBase files = Request.Files;

      foreach ( HttpPostedFileBase file in files ) {
            if ( file.ContentLength > 0 ) {
               if ( !file.ContentType.Equals( "image/vnd.dwg" ) ) {
                  return RedirectToAction( "List" );
               }
            }
         }
 }
ASPX页面中的

很简单:

<input type="file" name="file" />
<input type="file" name="file" />
...// many inputs type file

问题是foreach,因为它返回一个错误(我知道因为我在调试模式下运行并在foreach语句中放置了断点):

Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFileBase'.

我的错误是什么?

3 个答案:

答案 0 :(得分:10)

试试这样:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null && files.Count() > 0)
    {
        foreach (var uploadedFile in files)
        {
            if (uploadedFile.ContentType != "image/vnd.dwg") 
            {
                return RedirectToAction("List");
            }

            var appData = Server.MapPath("~/app_data");
            var filename = Path.Combine(appData, Path.GetFileName(uploadedFile.FileName));
            uploadedFile.SaveAs(filename);                    
        }
    }

    return RedirectToAction("Success");
}

并修改标记,以便文件输入命名为文件:

<input type="file" name="files" />
<input type="file" name="files" />
...// many inputs type file

答案 1 :(得分:3)

for (int i = 0; i < Request.Files.Count; i++)
{
    var file = Request.Files[i];
    // this file's Type is HttpPostedFileBase which is in memory
}

HttpRequestBase.Files需要索引,因此请使用for代替foreach

答案 2 :(得分:2)

请看Phil Haack的this post,它演示了如何使用MVC处理多个文件上传。您尝试使用的对象是ASP.NET Webforms。