【问题标题】:MVC File Upload save selected fileMVC File Upload 保存选择的文件
【发布时间】:2015-03-25 16:51:14
【问题描述】:

我有一个带有文件上传控制的表单,它按预期工作。但是,在单击提交按钮并从控制器返回模型以防页面上出现其他一些无效字段后,我无法弄清楚如何“保存”选定的文件? 每次页面出现错误时,用户都必须再次浏览文件。在控制器上调用 POST 后保存选择的最佳做法是什么?

//VIEW
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <input id="inputbox" type="file" name="PageUpload" />
  @Html.TextBoxFor(model => model.otherField1)
  @Html.TextBoxFor(model => model.otherField2)
}

//CONTROLLER
[HttpPost]
public ActionResult Create(MyViewModel view)
{
    try
    { ...
        if (ModelState.IsValid)
        {
            //it is valid save
            return RedirectToAction("Action", "Controller", new { id = view.ModelID });
        }
    }
    catch(Exception e){}
    return View(view);
}

在返回 View(view) 而不是输入控件后,我得到了正确绑定的所有其他字段。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    用户需要重新选择文件的原因是安全措施。您不能设置文件输入的值(如果可以,恶意站点可能包含数百个带有“C:\password.doc”等的隐藏文件输入,并试图在用户不知情的情况下下载敏感文件)。

    如果模型无效,需要在返回视图前保存文件。在我的例子中,我使用的视图模型包含一个对象,该对象包含文件的显示名称和路径的属性。基本前提是

    1. 将文件保存到临时位置
    2. 使用文件路径更新视图模型(到临时 位置)和显示名称
    3. 返回视图
    4. 在视图中,渲染显示名称(以便用户知道哪个文件 已被选中)和Path 的隐藏输入。一种 如果用户更改,“删除”按钮可以与此相关联 他们的想法并想选择不同的文件(使用ajax删除 临时文件)
    5. 如果发布时模型状态有效,则获取基于临时路径 隐藏输入的值并将文件移动到其永久 位置,然后保存模型并重定向。

    【讨论】:

    • 我担心由于安全原因它无法正常工作。但是,您的解决方案似乎是一个很好的方法。谢谢@stephen-muecke
    猜你喜欢
    • 2018-03-24
    • 2014-06-14
    • 2016-02-04
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多