【问题标题】:Display Image from database in ASP.NET Core 3.1在 ASP.NET Core 3.1 中显示数据库中的图像
【发布时间】:2021-03-02 11:00:40
【问题描述】:

我想显示上传图片中的个人资料图片,但如果用户尚未上传图片,我将使用默认图片。我有这段代码可以将图像数据保存到我的数据库中:

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();
        }
    }

所以我正在寻找要添加到 result.succeeded 的内容,其中上传的图片替换了默认照片并在我的 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>

谢谢。

【问题讨论】:

    标签: c# asp.net-core-3.1


    【解决方案1】:

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

        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();
        }
    

    【讨论】:

    • 你好乌斯曼,谢谢。我的 wwwroot 中有适用于所有用户的默认图像。
    • @ShanksLimbu 你可以查看这个stackoverflow.com/a/42599067/5671377
    • 嗨,Usman,我不知道我在那里看到了什么,但我在 wwwroot 中有这个默认图像,我知道如何将其取回。我只需要一种方法来从用户的数据库/上传的图像中检索数据,并将其用作用户个人资料照片的新来源。
    【解决方案2】:

    在视图中:

    @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
        }
        
    }
    

    【讨论】:

    • Hy Tanvir,感谢您的快速回复。我没有视图。这是剃须刀页面。 ImageData 指向我的应用程序用户而不是页面模型。如何在 razor 页面中访问 ImageData?
    • 嗨 Shanks,您可以做的是在 ViewBag 中设置图像并在页面中使用它。 ViewBag.ImageData = imageData;那么你可以使用 ViewBag 来获取 ImageData:Convert.ToBase64String(ViewBag.ImageData);
    • 嗨 Randy,您能否详细说明如何使用 ViewBag 实现它。谢谢。
    • @ShanksLimbu 最好将您的 RazorPage 模型代码添加到问题中。
    • 嗨@TanvirArjel 我已经更新了我的整个页面模型代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多