ASP.NET MVC - 如何上传图像并在数据库中保存URL

时间:2016-08-27 14:52:45

标签: c# jquery html asp.net asp.net-mvc

如果有人能帮助我,我将不胜感激。我在视图中的表单中输入文件控件,当有人选择图片并单击表单上的提交按钮时,该文件必须保存在应用程序的/ Pictures文件夹中,文件路径需要保存在SQL数据库中string(如:/ Pictures / filename)。

模型类部分:

[Table("Automobil")]
public partial class Automobil
{   .....
    [Required]
    [StringLength(30)]
    public string Fotografija{ get; set; }
    ......

查看(创建)文件部分:

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

....
<div class="form-group">
            <div class="editor-field">
                @Html.TextBoxFor(model => model.Fotografija, new { type = "file" })
                @Html.ValidationMessageFor(model => model.Fotografija, "", new { @class = "text-danger" })
            </div>
        </div>
....

控制器部分:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "AutomobilID,Marka,Model,Godiste,Zapremina_motora,Snaga,Gorivo,Karoserija,Fotografija,Opis,Cena,Kontakt")] Automobil automobil)
    {
        if (ModelState.IsValid)
        {
                db.Automobils.Add(automobil);
                db.SaveChanges();
                return RedirectToAction("Index");
        }

        return View(automobil);
    }

我需要做什么才能将照片(Fotografija)保存在应用程序文件夹中,以及SQL库中的文件路径(如/ Pictures / filename)?

提前感谢您帮助初学者。

2 个答案:

答案 0 :(得分:1)

您的Fotografija属性看起来像是要保存唯一文件名的字符串类型。您不希望使用该字段从浏览器获取文件。让我们使用另一个输入字段。

@using (Html.BeginForm("Index", "Home", FormMethod.Post, 
                                                   new { enctype = "multipart/form-data" }))
{
  <div class="form-group">
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Model)
            @Html.ValidationMessageFor(model => model.Model)
        </div>
    </div>
    <!-- TO DO : Add other form fields also -->

    <div class="form-group">
        <div class="editor-field">
           <input type="file" name="productImg" />
        </div>
    </div>
    <input type="submit" />
}

现在更新您的HttpPost操作方法,以再添加一个HttpPostedFileBase类型的参数。此参数的名称应与我们添加的输入文件字段名称(productImg)

相同
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "AutomobilID,Marka,Model,Godiste,
          Zapremina_motora,Snaga,Gorivo,Karoserija,Opis,Cena,Kontakt")] Automobil automobil, 
                                           HttpPostedFileBase productImg)
{
    if (ModelState.IsValid)
    {
        if(productImg!=null)
        {
          var fileName = Path.GetFileName(productImg.FileName);
          var directoryToSave = Server.MapPath(Url.Content("~/Pictures"));

           var pathToSave = Path.Combine(directoryToSave, fileName);
           productImg.SaveAs(pathToSave);
           automobil.Fotografija= fileName;
        } 

        db.Automobils.Add(automobil);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(automobil);
}

您必须在[Required]字段上删除任何验证数据注释修饰(例如:[MinLength]Fotografija等)。

我还强烈建议您在保存之前更新fileName,以避免碰撞/覆盖现有文件。您可以将DateTime当前值添加到文件名(扩展名之前)以使其唯一

答案 1 :(得分:0)

我在控制器中的代码是基本代码:

// GET: Automobili/Edit/5
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Automobil automobil = db.Automobils.Find(id);
        if (automobil == null)
        {
            return HttpNotFound();
        }
        return View(automobil);
    }

    // POST: Automobili/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "AutomobilID,Marka,Model,Godiste,Zapremina_motora,Snaga,Gorivo,Karoserija,Fotografija,Opis,Cena,Kontakt")] Automobil automobil)
    {
        if (ModelState.IsValid)
        {
            db.Entry(automobil).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(automobil);
    }

如何更改它以与上面的创建代码兼容?

谢谢。