ASP.Net MVC 5图像上传到文件夹
我有一个非常简单的MVC5应用程序,它有一个客户端的产品页面,我也在使用MVC 5中已经搭建的基本CRUD操作。
我有一个名为Cakes.cs的模型,因为客户销售蛋糕。 很简单。 以下是该模型的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace TastyCakes.Models { public class Cakes { public int CakesID { get; set; } public string Name { get; set; } public string Description { get; set; } public decimal Price { get; set; } public string CakeImage { get { return Name.Replace(" ", string.Empty) + ".jpg"; } } } }
如您所见,我正在使用计算属性为每个蛋糕创建一个图像名称。 每个蛋糕我只需要1个图像。 现在,当我在CRUD页面上编辑蛋糕时。 我想添加一个简单的图像上传,它将上传图像(不需要resize或缩略图)但是我想强加计算的属性名称。 换句话说:无论用户将照片命名为什么,我的上传代码都会将其重命名为Cakes.Name(减去任何空格)+“。jpg”,并将其保存为“~Image / Cakes”。
我只要求上传到实际的编辑页面,所以此时已经创建了蛋糕。 重命名文件所需的所有信息都应该可用,并且可以从“编辑”页面轻松使用。 以下是我的编辑页面代码:
编辑页面:
@model TastyCakes.Models.Cakes Edit Cakes
@using (Html.BeginForm()) { @Html.AntiForgeryToken()
@Html.ValidationSummary(true) @Html.HiddenFor(model => model.CakesID) @Html.LabelFor(model => model.Name) @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) @Html.LabelFor(model => model.Description) @Html.EditorFor(model => model.Description) @Html.ValidationMessageFor(model => model.Description) @Html.LabelFor(model => model.Price) @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) @Html.ActionLink("Back to List", "Index", null, new { @class = "tiny button" }) } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
我已经回顾了一些html5和ASP.Net 4解决方案,但这太过分了。 我想要的很简单。 任何想法或正确方向的踢都将非常感激。 我不仅将此代码用于客户网站,还包含在用于教授非常基本的MVC概念的虚构网站中。
你需要:
- 在表单中添加类型
file
的input
, - 在表单元素上有属性
enctype = "multipart/form-data"
然后将HttpPostedFileBase
添加到模型中,其名称与input
名称相同。 然后,在调用操作之前, HttpPostedFileModelBinder
将从上载的文件中填充模型属性。 注意,我认为您应该在某个地方添加模型ID,可能作为路径元素,以保证图像路径中的唯一性,以便图像不会被意外覆盖。
在http://www.prideparrot.com/blog/archive/2012/8/uploading_and_returning_files上有一个相当完整的讨论
public class Cakes { ... public HttpPostedFileBase UploadedFile { get; set; } } [HttpPost] public ActionResult Edit(Cakes cake) // I'd probably use a view model here, not the domain model { if (ModelState.IsValid) { if (cakes.UploadedFile != null) { cakes.UploadedFile.SaveAs(Path.Combine("path-to-images-for-this-cake", cakes.CakeImage)); } .... } }
这里提供的代码最终用于构建这个小型演示,允许您将图像上传到文件系统并动态使用它们,而无需将任何值存储到数据库中; 但是,您将把图像文件位置的字符串作为Model类的一部分,该类使用上传文件的约定和命名来显示。
我想将此上传到github,看看我是否无法让其他人帮助我找到一个更好的解决方案,使用这个想法。 考虑使它与MongoDB一起工作。
ASP.NET MVC 5图像上传和删除w /计算属性