如何在 asp.net core mvc 6 中实现模型绑定上传?
How to implement model binded upload in asp.net core mvc 6?
几乎所有关于此的教程都已过时,所以即使我找了很长时间也找不到任何能回答我的查询并且仍然有效的内容。
我有这样的模型
public class
{
public int Id { get; set; }
public string Title {get;set;}
public string Author {get;set;}
}
我想为 PDF 文件添加另一个变量。因此用户可以上传每本书的 pdf 文件,并在可能的情况下从中下载。根据我的理解,像 public IFormFile File { get; set; }
这样的东西就足够了。我认为视图是涉及特定 enctypes 的东西,asp-for 等所以这不是我真正关心的。
我的问题是关于一个执行我想要的操作的控制器,它仅为数据库中的模型条目上传文件。我见过一些用法 DBcontext.Model.add(entryname)
,但通常它以我无法理解或无法工作的内容开头。除此之外,我一无所知。
我在这里写了一个简单的demo,关于如何上传PDF文件并保存到数据库,我在很多地方都写了注释,希望能帮助你解决问题。
首先,您使用IFormFile
上传文件,但是数据库不能直接保存这种类型的数据,所以我选择将其转换为byte[]
然后存储在数据库中。
代码:
型号
//I use this model to create a database
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public byte[] book { get; set; }
}
//Because I need data of type IFormFile to upload the file, So i create BookViewModel,
//I will use this model to pass data from view to controller
public class BookViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public IFormFile book { get; set; }
}
数据上下文
//create the database
public class ApplicationContext : DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext> options): base(options)
{
}
public DbSet<Book> books { get; set; }
}
控制器
public class HomeController : Controller
{
//Use dependency injection to inject the database you just created into the controller
private readonly ApplicationContext _context;
public HomeController(ApplicationContext context)
{
_context = context;
}
public IActionResult UploadBook()
{
return View();
}
[HttpPost]
public async Task<IActionResult> UploadBook(BookViewModel model)
{
//Check if pdf file exists
if (model.book != null && model.book.Length>0)
{
//Instantiate Book, then assign the values of Author and Title in viewmode to Book
Book bookModel = new Book()
{
Author = model.Author,
Title = model.Title,
};
//Convert PDF file to byte[] and Give the byte[] to book
using (var target = new MemoryStream())
{
model.book.CopyTo(target);
bookModel.book = target.ToArray();
}
//use EF CORE and linq to add data and save .
_context.books.Add(bookModel);
_context.SaveChanges();
return RedirectToAction("Success");
}
return RedirectToAction("Fail");
}
}
查看
@model BookViewModel
<form method="post" enctype="multipart/form-data" asp-action="UploadBook">
<div class="form-group">
<label asp-for="@Model.Title"></label>
<input asp-for="@Model.Title" />
</div>
<div class="form-group">
<label asp-for="@Model.Author"></label>
<input asp-for="@Model.Author" />
</div>
<div class="form-group">
<label asp-for="@Model.book"></label>
<input asp-for="@Model.book" />
</div>
<button type="submit">upload</button>
</form>
结果:
终于,你可以看到我已经成功上传文件并保存到数据库中了。
几乎所有关于此的教程都已过时,所以即使我找了很长时间也找不到任何能回答我的查询并且仍然有效的内容。
我有这样的模型
public class
{
public int Id { get; set; }
public string Title {get;set;}
public string Author {get;set;}
}
我想为 PDF 文件添加另一个变量。因此用户可以上传每本书的 pdf 文件,并在可能的情况下从中下载。根据我的理解,像 public IFormFile File { get; set; }
这样的东西就足够了。我认为视图是涉及特定 enctypes 的东西,asp-for 等所以这不是我真正关心的。
我的问题是关于一个执行我想要的操作的控制器,它仅为数据库中的模型条目上传文件。我见过一些用法 DBcontext.Model.add(entryname)
,但通常它以我无法理解或无法工作的内容开头。除此之外,我一无所知。
我在这里写了一个简单的demo,关于如何上传PDF文件并保存到数据库,我在很多地方都写了注释,希望能帮助你解决问题。
首先,您使用IFormFile
上传文件,但是数据库不能直接保存这种类型的数据,所以我选择将其转换为byte[]
然后存储在数据库中。
代码:
型号
//I use this model to create a database
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public byte[] book { get; set; }
}
//Because I need data of type IFormFile to upload the file, So i create BookViewModel,
//I will use this model to pass data from view to controller
public class BookViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public IFormFile book { get; set; }
}
数据上下文
//create the database
public class ApplicationContext : DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext> options): base(options)
{
}
public DbSet<Book> books { get; set; }
}
控制器
public class HomeController : Controller
{
//Use dependency injection to inject the database you just created into the controller
private readonly ApplicationContext _context;
public HomeController(ApplicationContext context)
{
_context = context;
}
public IActionResult UploadBook()
{
return View();
}
[HttpPost]
public async Task<IActionResult> UploadBook(BookViewModel model)
{
//Check if pdf file exists
if (model.book != null && model.book.Length>0)
{
//Instantiate Book, then assign the values of Author and Title in viewmode to Book
Book bookModel = new Book()
{
Author = model.Author,
Title = model.Title,
};
//Convert PDF file to byte[] and Give the byte[] to book
using (var target = new MemoryStream())
{
model.book.CopyTo(target);
bookModel.book = target.ToArray();
}
//use EF CORE and linq to add data and save .
_context.books.Add(bookModel);
_context.SaveChanges();
return RedirectToAction("Success");
}
return RedirectToAction("Fail");
}
}
查看
@model BookViewModel
<form method="post" enctype="multipart/form-data" asp-action="UploadBook">
<div class="form-group">
<label asp-for="@Model.Title"></label>
<input asp-for="@Model.Title" />
</div>
<div class="form-group">
<label asp-for="@Model.Author"></label>
<input asp-for="@Model.Author" />
</div>
<div class="form-group">
<label asp-for="@Model.book"></label>
<input asp-for="@Model.book" />
</div>
<button type="submit">upload</button>
</form>
结果:
终于,你可以看到我已经成功上传文件并保存到数据库中了。