【问题标题】:Dynamic name on file upload fields in C#C#中文件上传字段的动态名称
【发布时间】:2018-07-31 10:56:57
【问题描述】:

我为我的公司创建了一个动态表单生成器。它允许用户创建具有不同名称的不同表单字段。处理表单很容易,但文件上传却是一场噩梦,因为控制器不知道表单字段的名称。 就我而言,表单字段可以是这样的:

<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 来准备表单,我希望能够在表单被重新处理后发送并在我的控制器中接收它。

【问题讨论】:

  • 你需要遍历Request.Files
  • 我试试看,我会告诉你,所以我可以接受你的答案是正确的。

标签: c# asp.net-mvc file-upload


【解决方案1】:

HttpRequest.Files 集合可用,它表示使用表单提交从&lt;input type="file" /&gt; 元素上传的文件。您只需要在标有HttpPostAttribute 的控制器操作内使用forforeach 循环对其进行迭代:

for-loop 版本

for (int i = 0; i < Request.Files.Count; i++)
{
    var uploadedFile = Request.Files[i] as HttpPostedFileBase;

    if (uploadedFile.ContentLength > 0)
    {
        // do something
    }
}

foreach-loop 版本

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 获取相应的文件名)。

【讨论】:

  • 谢谢,我使用了你的解决方案。请注意,字段名称(如表单中的)存储在集合中:Request.Files.AllKeys
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2018-08-28
相关资源
最近更新 更多