使用for each on request.files将文件和名称保存到数据库表中



MVC3 VB.NET应用程序。我的mvc3应用程序中的一个表单上有多个文件上传框。当我在下面的函数中放一个断点并查看它时,Request.Files显示了3个文件。问题是除了编码一个计数器并使用select case之外,我看不出有什么方法可以将每个文件名保存到它所属的数据库列中…我想你可以说,是否可以动态分配变量,这样foreach循环就会将文件放在正确的列中。。即handoutFile1、handoutFile2、handoutFile3等。…目前,每次循环通过时,下面的内容都会覆盖handoutFile1中的文件名。。。。我想过在循环中抛出一个计数器,然后在它上面放一个select case,根据计数器编号分配db列。不过这似乎是一个廉价的替代品。

 For Each File As String In Request.Files
                Dim hpf As HttpPostedFileBase = TryCast(Request.Files(File), HttpPostedFileBase)
                If hpf.ContentLength = 0 Then
                    Continue For
                End If
                Dim savedfileName As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "CourseHandouts" + hpf.FileName
                hpf.SaveAs(savedfileName)
                _filename = hpf.FileName
                courses.handoutFile1 = _filename
            Next

我不知道VB.Net,但我会尝试用C#代码回答,

在您的操作中,您可以将参数定义为

    [HttpPost]
    public ActionResult Index(IList<HttpPostedFileBase> postedFiles)
    {
        foreach (var file in postedFiles)
        {
            //
        }
        return View();
    }

在如下视图中,

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data"  }))
{
@Html.ValidationSummary(true)
<fieldset>
    <legend>TestModel</legend>
    @Html.TextBox("postedFiles[0]",null, new { type = "file" })
    @Html.TextBox("postedFiles[1]",null, new { type = "file" })
    @Html.TextBox("postedFiles[2]",null, new { type = "file" })
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}  

您的数据库设计似乎是错误的。您可以创建另一个表,该表将所有文件作为行包含,并且第一个表将有一个外键来匹配记录,而不是试图将每个单独的文件保存在一个单独的列中。所以你基本上会有courses.handoutFiles,它将是一个数组,而不是courses.handoutFile1courses.handoutFile2。。。

另一方面,如果出于某种原因,您需要使用初始模式并保存到单独的列中,那么除了使用难看的代码之外,您别无选择。

最新更新