繁体   English   中英

C#中文件上传字段的动态名称

[英]Dynamic name on file upload fields in C#

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

<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来准备表单,我希望能够像过去一样发送表单,并在我的控件中接收它。

提供了HttpRequest.Files集合,该集合表示使用表单HttpRequest.Files<input type="file" />元素上传的文件。 您只需要在标记为HttpPostAttribute控制器操作内使用forforeach循环对其进行迭代:

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集合具有重复的文件名,则第一个匹配的文件名将被存储多次,即使它们的大小不同( 此处是相关问题)。 因此, for循环方法是更可取的(并且您仍然可以使用uploadedFile.FileName获得相应的文件名)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM