使用MVC上传和处理多个文件

本文关键字:文件 处理 MVC 使用 | 更新日期: 2023-09-27 18:13:26

我正在尝试在我的web应用程序上上传多个文件。因此,我使用IEnumerable<HttpPostedFileBase>类在每个文件内循环。但是我得到一个错误的陈述-

错误System.Collections.Generic.IEnumerable<System.Web.HttpPostedFileBase>不包含'ContentLength'的定义,并且没有扩展方法'ContentLength'接受类型System.Collections.Generic.IEnumerable<System.Web.HttpPostedFileBase '的第一个参数可以找到(您是否缺少using指令或程序集引用?)

此错误适用于HttpPostedFileBase类中存在的所有属性。我试图编辑类,但它不允许。我尝试在我的ViewModel中创建一个IEnumerable的HttpPostedFileBase类,但它再次失败。我遗漏了什么?

更新-代码:查看

<div class="col-sm-8">                                  
 <input type="file" name="Files" id="file1" class="form-control" />
  <input type="file" name="Files" id="file2" class="form-control" />
  <input type="submit" value="Save" class="btn btn-default" name="Command"/>   
</div>
控制器

public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> Files)
{
     foreach (var item in Files)
     { 
           if (Files != null && Files.ContentLength > 0)
           {
                FileUpload up = new FileUpload();
                up.PersonId = model.PersonId;
                up.FileName = System.IO.Path.GetFileName(Files.FileName);
                up.MimeType = Files.ContentType;
                up.FileContent = Files.Content;
                bll.AddFileUpload(up);
            }
     }
     return View();
}

使用MVC上传和处理多个文件

问题就在这里:

foreach (var item in Files)
    if (Files != null && Files.ContentLength > 0)

您使用foreach来迭代集合,但是您仍然检查称为FileIEnumerable而不是每个项目。你想要的是:

foreach (var item in Files)
    if (item != null && item.ContentLength > 0)

作为旁注,您可以使用Enumerable.Where:

过滤掉项目
foreach (var item in Files.Where(file => file != null && file.ContentLength > 0))
{
    FileUpload up = new FileUpload
    {
         PersonId = model.PersonId,
         FileName = System.IO.Path.GetFileName(item.FileName),
         MimeType = item.ContentType,
         FileContent = item.Content,
     };
     bll.AddFileUpload(up);
}

您试图在集合上调用.ContentLength,而不是在该集合中的文件上。相反,请尝试这样做:

// given postedFiles implements IEnumerable<System.Web.HttpPostedFileBase
foreach(var postedFile in postedFiles) {
 var len = postedFile.ContentLength
}

您的代码试图访问集合本身,但您需要像这样访问集合项:

foreach (var item in Files)
{
FileUpload up = new FileUpload();
up.PersonId = model.PersonId;
up.FileName = System.IO.Path.GetFileName(item.FileName);
up.MimeType = Files.ContentType;
up.FileContent = item.Content;
bll.AddFileUpload(up);
}