我为我的公司创建了一个动态表格生成器。它允许用户创建具有不同名称的不同表单字段。处理表单很容易,但是文件上载一直是噩梦,因为控制器不知道表单字段的名称。 就我而言,表单字段可以像这样:
<input type="file" name="certificate" accept=".pdf" />
或
<input type="file" name="course-certificate" accept=".pdf, .docx" />
它甚至可以以一种形式包含一个或多个文件字段
问题是,提交表单后转到post方法时,应该为文件提供一个参数。它可以是单个文件,例如:
[HttpPost]
public ActionResult Create(HttpPostedFileBase file) // For a single file upload
{
}
或
[HttpPost]
public ActionResult Create(IEnumerable<HttpPostedFileBase> files) // For multiple file uploads
{
}
但是我需要发送带有随机名称的文件,这些名称甚至可以在中间加一个破折号。有什么解决方案? 我不想在发送表单之前使用任何jQuery来准备表单,我希望能够像过去那样发送表单并像这样那样在我的控件中接收它。
答案 0 :(得分:1)
有HttpRequest.Files
个可用集合,这些集合表示使用表单提交从<input type="file" />
个元素中上传的文件。您只需要在标记为for
的控制器操作中使用foreach
或HttpPostAttribute
循环对其进行迭代:
for
-循环版本
for (int i = 0; i < Request.Files.Count; i++)
{
var uploadedFile = Request.Files[i] as HttpPostedFileBase;
if (uploadedFile.ContentLength > 0)
{
// do something
}
}
foreach
-循环版本
foreach (string fileName in Request.Files)
{
var uploadedFile = Request.Files[fileName] as HttpPostedFileBase;
if (uploadedFile.ContentLength > 0)
{
// do something
}
}
注意:在foreach
循环中,如果Request.Files
集合具有重复的文件名,则第一个匹配的文件名将被存储多次,即使它们的大小不同(相关问题here)。因此,for
循环方法是更可取的(并且您仍然可以使用uploadedFile.FileName
获得相应的文件名)。