MVC 5多文件上传多次上传同一文件

时间:2014-11-12 10:04:17

标签: asp.net-mvc httprequest multifile-uploader

我使用asp.net 4.5和MVC 5构建了一个网站。 在我的一个视图中,我想上传多个文件。 使用下面的代码,收集并保存第一个文件,但保存的次数与我尝试上传的文件数一样多。

例如: 我用文件上传器选择文件 pic1.jpg pic2.jpg 。这导致文件 pic1.jpg 被保存两次。

调试时我发现Request.Files[file];代码每次都返回相同的文件。似乎我得到了两次相同的文件上传器,并且只选择了第一个文件。

如何更改代码以获取通过上传器选择的所有文件?

控制器

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(ProductViewModel product)
        {
            ...

            foreach (string file in Request.Files)
            {
                var hpf = Request.Files[file];
                if (hpf != null && hpf.ContentLength > 0)
                {
                    var savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(hpf.FileName));
                    hpf.SaveAs(savedFileName);
                }
            }

            ...

            return RedirectToAction<ProductController>(x => x.Index());
        }

查看

@model EVRY.OrderCapture.Administration.ViewModels.ProductViewModel
<h2>@Resources.Resources.Create</h2>

@using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">

        ...

        <div class="form-group">
            <label for="fileUpload" class="control-label col-md-2">Filename:</label>
            <div class="col-md-10">
                <input type="file" name="files" id="fileUpload" multiple />
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="@Resources.Resources.Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

1 个答案:

答案 0 :(得分:4)

我自己找到了答案。 我必须选择索引而不是名称。

for (var i = 0; i < Request.Files.Count; i++)
        {
            var hpf = Request.Files[i];
            if (hpf != null && hpf.ContentLength > 0)
            {
                var savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(hpf.FileName));
                hpf.SaveAs(savedFileName);
            }
        }