显示ASP.NET Core 3.1中数据库中的图像



我想显示上传图像中的个人资料图片,但如果用户没有上传图像,则会有一个默认图像。我有这个代码,它保存图像数据到我的数据库:

public class UserProfileModel : PageModel
{
private readonly UserManager<ApplicationUser> _userManager;
public readonly IWebHostEnvironment _env;
private readonly IPhoto _photo;
public UserProfileModel(UserManager<ApplicationUser> userManager,
IWebHostEnvironment env)
{
_userManager = userManager;
_env = env;
}
[BindProperty]
[Required]
[MaxLength(30, ErrorMessage = "USERNAME CANNOT EXCEED 30 LETTERS.")]
public string Name { get; set; }
[BindProperty]
[Required]
[DataType(DataType.Date)]
public string DateOfBirth { get; set; }
[BindProperty]
[Required]
[EmailAddress]
[Display(Name = "Email Address")]
public string Email { get; set; }
[BindProperty]
[Required]
[DataType(DataType.PhoneNumber)]
public string Mobile { get; set; }
[BindProperty]
[Required]
public int Gender { get; set; }
[BindProperty]
[Required]
public string Country { get; set; }
[BindProperty]
public IFormFile Image { get; set; }
public List<SelectListItem> Countrydropdownlist { get; set; }
public void OnGet()
{
Countrydropdownlist = GetCountryItems();
}
public List<SelectListItem> GetCountryItems()
{
string filepath = Path.Combine(_env.ContentRootPath, "CountryList.json");
string jsonlist = System.IO.File.ReadAllText(filepath);
var result = JsonConvert.DeserializeObject<RootCountry>(jsonlist);
List<SelectListItem> _countrydropdownlist = new List<SelectListItem>();
foreach (var nation in result.Countries)
{
_countrydropdownlist.Add(new SelectListItem { Value = nation.Code.ToString(), Text = nation.Name });
}
return _countrydropdownlist;
}
public async Task<IActionResult> OnPostUpdate()
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(User.Identity.Name);
user.Name = Name;
user.DateOfBirth = DateOfBirth;
user.PhoneNumber = Mobile;
user.Email = Email;
user.Country = Country;
user.Gender = Gender;
if(Image != null)
{
if(Image.Length > 0)
{
using var streamReader = Image.OpenReadStream();
using var memoryStream = new MemoryStream();
streamReader.CopyTo(memoryStream);
byte[] uploadedImage = memoryStream.ToArray();
user.ImageData = uploadedImage;
}
}
var result = await _userManager.UpdateAsync(user);
if (result.Succeeded)
{
//Repopulate dropdownlist
Countrydropdownlist = GetCountryItems();
return Page();
}
}
return Page();
}
}

因此,我正在寻找添加到结果中的内容。成功的是,上传的图像取代了默认照片,并在我的Razor页面中显示为图像源。我的cshtml:

@page
@model TravelMate.Pages.UserProfileModel
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, shrink-to-fit=no" />
@{
ViewBag.Title = "User Profile";
}
<style>
img {
border-radius: 50%;
}
</style>
<link href="~/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div class="row">
<div class="col text-center">
<br />
<img src="~/Image/GeneralUser.jpg" alt="User Image" style="height: 300px">
<br />
</div>
</div>
<form enctype="multipart/form-data" method="post" asp-page-handler="Update">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label asp-for="DateOfBirth"></label>
<input asp-for="DateOfBirth" class="form-control" />
<span asp-validation-for="DateOfBirth" class="text-danger"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label asp-for="Mobile"></label>
<input asp-for="Mobile" class="form-control" />
<span asp-validation-for="Mobile" class="text-danger"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label asp-for="Email"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label asp-for="Country"></label>
<select asp-for="Country" asp-items="@Model.Countrydropdownlist">
<option selected disabled> ---Select Country---</option>
</select>
<span asp-validation-for="Country" class="text-danger"></span>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label asp-for="Gender"></label>
<select asp-for="Gender" class="form-control">
<option value="0" selected disabled>Select Gender</option>
<option value="1">Male</option>
<option value="2">Female</option>
</select>
<span asp-validation-for="Gender" class="text-danger"></span>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label asp-for="Image"></label>
<div class="custom-file">
<input asp-for="Image" class="form-control custom-file-input" />
<label class="custom-file-label">Choose File...</label>
</div>
</div>
</div>
</div>
@section Scripts{
<script>
$(document).ready(function () {
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\").pop();
$(this).next('.custom-file-label').html(fileName);
});
});
</script>
}
<button type="submit" class="btn btn-primary">Update</button>
</form>
</div>
<script src="~/jquery/jquery.slim.min.js"></script>
<script src="~/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

谢谢。

在视图中:

@model User
@{
if(Model.ImageData != null)
{
var base64 = Convert.ToBase64String(Model.ImageData);
var userImage = String.Format("data:image/gif;base64,{0}", base64);
<img src="@userImage" alt="User Image" style="height: 300px">
}
else
{
<img src="..." alt="User Image" style="height: 300px"> // Your default image is here
}

}

如果图像没有上传,您可以尝试将默认图像保存在数据库中

public async Task<IActionResult> OnPostUpdate()
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(User.Identity.Name);
user.Name = Name;
user.DateOfBirth = DateOfBirth;
user.PhoneNumber = Mobile;
user.Email = Email;
user.Country = Country;
user.Gender = Gender;
if(Image != null)
{
if(Image.Length > 0)
{
using var streamReader = Image.OpenReadStream();
using var memoryStream = new MemoryStream();
streamReader.CopyTo(memoryStream);
byte[] uploadedImage = memoryStream.ToArray();
user.ImageData = uploadedImage;
}
}
//Here you will get the default image from server and save it
else
{
string filepath = "default_image.PNG";
byte[] uploadedImage = System.IO.File.ReadAllBytes(filepath);
user.ImageData = uploadedImage;
}
var result = await _userManager.UpdateAsync(user);
if (result.Succeeded)
{
//Repopulate dropdownlist
Countrydropdownlist = GetCountryItems();
return Page();
}
}
return Page();
}

最新更新