我正在尝试上传学生的多张图像。我想在数据库中保存文件名,并在www / studentimages目录中上传图像。但是,使用我尝试过的方法,我可以上传多张图片,但只有它可以将最后选择的图片的名称保存在数据库中。
public async Task<IActionResult> NewStudent(Student p)
{
var files = HttpContext.Request.Form.Files;
foreach (var Image in files)
{
if (Image != null && Image.Length > 0)
{
var file = Image;
var uploads = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/studentimages");
if (file.Length > 0)
{
var fileName = ContentDispositionHeaderValue.Parse
(file.ContentDisposition).FileName.Trim('"');
System.Console.WriteLine(fileName);
using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fileStream);
p.Image = file.FileName;
}
}
}
}
_context.Students.Add(p);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
***My Student Class***
using System.Collections.Generic;
namespace PhotoUpload.Models
{
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public List<string> Image{get;set;}
}
}
答案 0 :(得分:1)
您在每个循环中都覆盖了学生图像, 更改
p.Image = file.FileName;
到
p.Image = p.Image +"-"+ file.FileName;
因此,这将为学生保存所有文件名,并用“-”分隔。
如果要显示学生图像,则需要再次分隔文件名,可以使用split()来实现。
string[] filenames = p.Image.Split('-');
这将返回包含您的文件名的字符串数组。
由于模型中没有图像列表,因此应使用剃刀代码在视图中进行分割:
@foreach (var filename in Model.Image.Split('-'))
{
<img src="PathWhereImageIsSave/@filename" alt="" />
}
明确地说,这种方法不是最好的,文件名中可以包含“-”,这会使分割失败,我的建议是,如果要让学生学习很多图像,则应创建一个表格与您的学生表有关的文件,然后执行类似Erdi所说的
答案 1 :(得分:1)
更改班级
public string Image {get;set;}
到
public List<string> Image{get;set;}
并在控制器中进行更改
p.Image = file.FileName;
到
p.Image = new List<string>();
p.Image.Add(file.Filename)
我认为它可以为您提供帮助。如果不是,我需要您的学生班来帮助您。
用于在视图中显示
@foreach(var item in Model.Image)
{
<img src="~/studentimages/@item.Filename" />
}
您需要为wiev代码进行编辑