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

Bur*_*bim 6 c# database asp.net asp.net-mvc asp.net-mvc-4

我在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; }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*ser 17

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

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

这很常见:

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

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

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);
    }
Run Code Online (Sandbox Code Playgroud)

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