想要将图像保存到文件夹并将URL保存在数据库中

我是asp.net mvc的新手。 在这里我有一个问题,在控制器图像上传任何人都可以给予帮助? 我从互联网上获得的这个示例控制器,我应该更改和编码viewnya,这里我想通过“AvatarUrl”保存图像

模型> EmployeeServices

public class EmployeeModel{ [ScaffoldColumn(false)] public int EmployeeID { get; set; } [Required(ErrorMessage = "Please Enter Position ID")] public int PositionID { get; set; } [Required(ErrorMessage = "Please Enter NO PEK")] public string NoPEK { get; set; } [Required(ErrorMessage = "Please Enter NO KTP")] public string NoKTP { get; set; } [Required(ErrorMessage = "Please Enter TaxID")] public string TaxID { get; set; } [Required(ErrorMessage = "Please Enter FirstName")] public string FirstName { get; set; } [Required(ErrorMessage = "Please Enter LastName")] public string LastName { get; set; } [Required(ErrorMessage = "Please Enter OrganizationID")] public int OrganizationID { get; set; } [Required(ErrorMessage = "Please Enter BirthPlace")] public string BirthPlace { get; set; } [Required(ErrorMessage = "Please Enter BirthDay")] public System.DateTime BirthDay { get; set; } [Required(ErrorMessage = "Please Enter Gender")] public string Gender { get; set; } [Required(ErrorMessage = "Please Enter Religion")] public string Religion { get; set; } [Required(ErrorMessage = "Please Enter TaxAddress")] public string TaxAddress { get; set; } [Required(ErrorMessage = "Please Enter Home Address")] public string HomeAddress { get; set; } [Required(ErrorMessage = "Please Enter Current Address")] public string CurrentAddress { get; set; } [Required(ErrorMessage = "Please Enter Phone Number")] public string PhoneNumber { get; set; } [Required(ErrorMessage = "Please Enter Email")] public string Email { get; set; } [Required(ErrorMessage = "Please Enter IsAuditor")] public string IsAuditor { get; set; } [Required(ErrorMessage = "Please Enter TaxProvince ")] public int TaxProvinceID { get; set; } [Required(ErrorMessage = "Please Enter Tax City ")] public int TaxCityID { get; set; } [Required(ErrorMessage = "Please Enter Home Province ")] public int HomeProvinceID { get; set; } [Required(ErrorMessage = "Please Enter Home City")] public int HomeCityID { get; set; } [Required(ErrorMessage = "Please Enter Current Province")] public int CurrentProvinceID { get; set; } [Required(ErrorMessage = "Please Enter Current City")] public int CurrentCityID { get; set; } [Required(ErrorMessage = "Please Enter Avatar Url")] public string AvatarUrl { get; set; } } 

Controller> EmployeesController

  [HttpPost] public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) { if (ModelState.IsValid) { var filename = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); file.SaveAs(path); tyre.Url = filename; _db.EventModels.AddObject(eventmodel); _db.SaveChanges(); return RedirectToAction("Index"); } return View(eventmodel); } 

上传文件,存储在本地文件系统中,并保存到数据库是一种常见的模式。 这些是我的建议。

1.不要使用上传的文件名作为文件名。

这很常见:

 var filename = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); file.SaveAs(path); 

不要这样做。 有几个原因:

a)文件名可能会发生冲突。 b)远程文件名可能与本地文件系统不兼容。 c)有人可能会尝试使用恶意文件名,这可能会破坏您的服务器。

而是生成您自己的文件名(可能使用GUID, GUID.NewGuid().ToString() )并将原始文件名存储在您的数据库中。

2.不要将所有文件存储在单个文件夹中

在某些时候,您的文件夹将包含太多文件,操作系统无法快速处理。

通过有用的东西对文件进行分区,例如用户ID。 这也有助于在用户之间隔离文件。

3.不要在数据库中存储文件的完整路径

在某些时候,您可能会移动文件(可能是另一个驱动器),并且所有存储的文件位置都将被破坏。

4.不要将图像URL存储在数据库中

与#3相同。 如果您的Web应用程序发生更改并且您想要更改图像URL,那么您在数据库中存储的URL不正确。 您必须扫描并更新所有数据库记录。

5.不要在数据库中存储冗余路径信息

虽然在数据库中存储的URL中包含“Uploads / Photo /”可能很诱人,但它也存在许多问题:

a)这是冗余数据。 对于每个文件,您都在使用额外的,不必要的数据空间。 b)如果您的应用更改并且URL应该更改,则您的存储的URL现在已损坏。

相反,在从数据库中读取值之后,将“Uploads / Photo /”添加到URL。

更新:

以下是一些示例代码:

  [HttpPost] public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) { if (ModelState.IsValid) { var originalFilename = Path.GetFileName(file.FileName); string fileId = Guid.NewGuid().ToString().Replace("-", ""); string userId = GetUserId(); // Function to get user id based on your schema var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), userId, fileId); file.SaveAs(path); eventModel.ImageId = fileId; eventmodel.OriginalFilename = originalFilename; _db.EventModels.AddObject(eventmodel); _db.SaveChanges(); return RedirectToAction("Index"); } return View(eventmodel); } 

但是,我会谨慎使用您的数据模型作为MVC操作模型。

您应该将AvatarUrl更改为:

 public HttpPostedFileBase AvatarUrl { get; set; } 

在您的视图中,您可以创建类似于以下的表单。 添加您将接受输入的字段,并为您的头像使用文件输入。 当表单回发到控制器时,MVC将尝试将输入绑定到参数。

 @using(Html.BeginForm("Create", FormMethod.Post, new { enctype = "multipart/form-data" }) { 
@Html.LabelFor(m => m.FirstName) @Html.EditorFor(m => m.FirstName)
@Html.LabelFor(m => m.Avatar) @Html.EditorFor(m => m.Avatar)
})

您的控制器方法应更新为:

 [HttpPost] public ActionResult Create(EmployeeModel model) { if (ModelState.IsValid) { // Create avatar on server var filename = Path.GetFileName(model.AvatarUrl.FileName); var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); file.SaveAs(path); // Add avatar reference to model and save model.AvatarUrl = string.Concat("Uploads/Photo/", filename); _db.EventModels.AddObject(model); _db.SaveChanges(); return RedirectToAction("Index"); } return View(model); } 

如果你仍然被卡住,请告诉我,我可以详细介绍。

还有一个很好的/详细的写作,与你在这里尝试做的有关http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/