在ASP.NET MVC 6中上传文件 [英] Upload File in ASP.NET MVC 6
问题描述
我在熨烫ASP.NET MVC 6中的文件/图像时遇到了麻烦.大多数教程似乎已经过时,甚至一些新教程似乎都引用了没有意义的东西.
I'm having trouble ironing out the file/image upload in ASP.NET MVC 6. Most tutorials appear to be outdated, and even some of the new ones seem to reference things that don't make sense.
我认为:
<div class="form-group">
@using (Html.BeginForm("Create", "PostNin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<label asp-for="NinImageString" class="control-label"></label>
<input type="file" name="files" class="form-control" />
}
@*<input asp-for="NinImageString" class="form-control" />
<span asp-validation-for="NinImageString" class="text-danger"></span>*@
</div>
<div class="form-group">
<label asp-for="NinImageCaption" class="control-label"></label>
<input asp-for="NinImageCaption" class="form-control" />
<span asp-validation-for="NinImageCaption" class="text-danger"></span>
</div>
然后在我的控制器中:
// GET: PostNins/Create
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, IFormFile files)
{
// need code here
if (ModelState.IsValid)
{
_context.Add(postNin);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(postNin);
}
我的理解是我必须使用 IFormFile
来实现这一目标.
My understanding is that I have to use IFormFile
to pull this off.
我想上传带有标题的图像,并将其存储到应用程序文件夹 NinImages
中,以便以后使用.我想我也对此有疑问,但这是另一个问题.
I would like to upload an image with a caption, and store it into the application folder NinImages
where I can access it later. I suppose I have questions about that too, but that's for another question.
我的理解是,我必须以某种方式将映像的副本保存到wwwroot下的目录系统中,然后将文件的路径作为字符串保存到数据库中.
My understanding is that I have to somehow save a copy of the image into the directory system, under wwwroot, then save the path of the file as a string to the database.
解决方案:
我的新控制器如下所示.请注意,fileTime只是为每个上载分配一个唯一值,以避免重复.在这种情况下有效,因为一次只能上传一个文件.
My new controller looks like below. As a note, the fileTime is only to assign a unique value to each upload, to avoid duplicates. This works in this case because only one file can be uploaded at a time.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,NinFk,NinDigit,NinImageString,NinImageCaption,NinNote")] PostNin postNin, IFormFile uploadFile)
{
if (uploadFile != null && uploadFile.Length > 0)
{
var fileTime = DateTime.UtcNow.ToString("yyMMddHHmmss");
var fileName = fileTime + Path.GetFileName(uploadFile.FileName);
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/NinFileUploads", fileName);
postNin.NinImageString = filePath;
_context.PostNins.Add(postNin);
_context.SaveChanges();
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await uploadFile.CopyToAsync(fileStream);
}
//if (ModelState.IsValid)
//{
// _context.Add(postNin);
// await _context.SaveChangesAsync();
// return RedirectToAction(nameof(Index));
//}
return RedirectToAction(nameof(Index));
}
return View(postNin);
推荐答案
以下是演示作品:
PostNin类:
public class PostNin
{
public int Id { get; set; }
public string Name { get; set; }
public string ImagePath { get; set; }
}
控制器:
public async Task<bool> Create(PostNin postNin,IFormFile upload)
{
if (upload != null && upload.Length > 0)
{
var fileName = Path.GetFileName(upload.FileName);
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images", fileName);
postNin.ImagePath = filePath;
_context.PostNins.Add(postNin);
_context.SaveChanges();
using (var fileSrteam = new FileStream(filePath, FileMode.Create))
{
await upload.CopyToAsync(fileSrteam);
}
return true;
}
return false;
}
结果:
这篇关于在ASP.NET MVC 6中上传文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!