ASP.NET Core上传文件到数据库

原创 Laughing  2017-10-30 00:09  阅读 527 次 评论 0 条

首先,我们要明确,将文件上传到数据库的设计是一种非常不明智的设计。这会导致数据库文件非常大,而且不利于数据的迁移。本篇文章只是为了演示ASP.NET Core下文件的上传功能。

数据库设计

  1. USE [DotNetCore]  
  2. GO  
  3.   
  4. /****** Object:  Table [dbo].[Users]    Script Date: 2017/10/29 23:59:29 ******/  
  5. SET ANSI_NULLS ON  
  6. GO  
  7.   
  8. SET QUOTED_IDENTIFIER ON  
  9. GO  
  10.   
  11. CREATE TABLE [dbo].[Users](  
  12.     [Name] [varchar](50) NOT NULL,  
  13.     [IdNumber] [varchar](50) NOT NULL,  
  14.     [IdCardImage] [image] NOT NULL,  
  15. PRIMARY KEY CLUSTERED   
  16. (  
  17.     [IdNumber] ASC  
  18. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [PRIMARY]  
  19. ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]  
  20. GO  

创建实体类

由于数据库存储图片的类型是image类型,我们文件上传使用的是IFormFile类型,所以我们这里创建两个实体,UserModelView.cs用户前台的展示并且作为上传数据的模型,User.cs与数据库进行交互,对应的代码分别如下:

  1. using System.ComponentModel.DataAnnotations;  
  2. using Microsoft.AspNetCore.Http;  
  3.   
  4. namespace NetCoreStudy.WebUI.Entity  
  5. {  
  6.     public class UserModelView  
  7.     {  
  8.          [Required(ErrorMessage="请输入姓名")]  
  9.         [Display(Name="姓名")]  
  10.         public string Name { getset; }  
  11.   
  12.         [Required(ErrorMessage="请输入身份证号")]  
  13.         [Display(Name="身份证")]  
  14.         [Key]  
  15.         [RegularExpression(@"^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$", ErrorMessage = "身份证号不合法")]  
  16.         public string IdNumber{get;set;}  
  17.   
  18.         [Required(ErrorMessage="请上传身份证照片")]  
  19.         [Display(Name="身份证图片")]  
  20.         [FileExtensions(Extensions = ".jpg,.png", ErrorMessage = "图片格式错误")]  
  21.         public IFormFile IdCardImage{get;set;}  
  22.     }  
  23. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel.DataAnnotations;  
  4. using System.Linq;  
  5. using System.Threading.Tasks;  
  6. using Microsoft.AspNetCore.Http;  
  7.   
  8. namespace NetCoreStudy.WebUI.Entity  
  9. {  
  10.     public class User  
  11.     {  
  12.         public string Name { getset; }  
  13.   
  14.         [Key]  
  15.         public string IdNumber { getset; }  
  16.   
  17.         public byte[] IdCardImage { getset; }  
  18.     }  
  19. }  

前台代码

  1. @model NetCoreStudy.WebUI.Entity.UserModelView  
  2.   
  3. <form asp-controller="User" asp-action="New" method="post" role="form" enctype="multipart/form-data">  
  4.         <h2>@Html.Raw(TempData["Message"])</h2>  
  5.     <div class="form-group">        
  6.         <label asp-for="Name"></label>  
  7.         <input type="text" class="form-control" asp-for="Name"/>  
  8.         <span asp-validation-for="Name" class="ValidateError"></span>  
  9.     </div>  
  10.     <div class="form-group">  
  11.         <label asp-for="IdNumber"></label>  
  12.         <input type="text" asp-for="IdNumber" class="form-control"/>  
  13.          <span asp-validation-for="IdNumber" class="ValidateError"></span>  
  14.     </div>  
  15.     <div class="form-group">  
  16.         <label asp-for="IdCardImage"></label>  
  17.         <input type="file" asp-for="IdCardImage" />  
  18.          <span asp-validation-for="IdCardImage" class="ValidateError"></span>  
  19.     </div>  
  20.     <button type="submit" class="btn btn-success">提交</button>  
  21. </form>  

控制器代码

  1. using System.IO;  
  2. using Microsoft.AspNetCore.Hosting;  
  3. using Microsoft.AspNetCore.Mvc;  
  4. using NetCoreStudy.WebUI.Core;  
  5. using NetCoreStudy.WebUI.Entity;  
  6.   
  7. namespace NetCoreStudy.WebUI.Controllers  
  8. {  
  9.     public class UserController : Controller  
  10.     {  
  11.         private IUserCore userCore;  
  12.         private IHostingEnvironment env;  
  13.         public UserController(IUserCore _userCore, IHostingEnvironment environment)  
  14.         {  
  15.             userCore = _userCore;  
  16.             env = environment;  
  17.         }  
  18.         public ActionResult Index()  
  19.         {  
  20.             return View();  
  21.         }  
  22.   
  23.         [HttpPost]  
  24.         public ActionResult New(UserModelView user)  
  25.         {  
  26.             if(!ModelState.IsValid){  
  27.                 Index();  
  28.             }  
  29.             var contentRoot = env.ContentRootPath;  
  30.             var imagePath = contentRoot + "/Images";  
  31.             if (!Directory.Exists(imagePath))  
  32.             {  
  33.                 Directory.CreateDirectory(imagePath);  
  34.             }  
  35.             if(System.IO.File.Exists(imagePath + user.IdCardImage.FileName)){  
  36.                 System.IO.File.Delete(imagePath + user.IdCardImage.FileName);  
  37.             }  
  38.             using (FileStream fs = new FileStream(imagePath + user.IdCardImage.FileName, FileMode.CreateNew))  
  39.             {  
  40.                 user.IdCardImage.CopyTo(fs);  
  41.                 fs.Close();  
  42.             }  
  43.             FileStream fileStream = new FileStream(imagePath + user.IdCardImage.FileName, FileMode.Open);  
  44.             byte[] bytes = new byte[fileStream.Length];  
  45.             fileStream.Read(bytes, 0, bytes.Length);  
  46.             var userAdd = new User  
  47.             {  
  48.                 Name = user.Name,  
  49.                 IdNumber = user.IdNumber,  
  50.                 IdCardImage = bytes  
  51.             };  
  52.             userCore.AddUser(userAdd);  
  53.             TempData["Message"] = "提交成功";  
  54.             return RedirectToAction("Index");  
  55.         }  
  56.     }  
  57. }  

本文地址:https://www.lisen.me/asp-net-core-upload-files-to-the-database.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情