Проблема в HttpPostedFileBase при сохранении изображений в базе данных - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь получить байты изображения из моей базы данных. Сначала я использую код структуры объекта. Я передаю в параметре метода Httppost 2, один - это представление модели, а второй - список HttpPostedFileBase в виде списка. Когда я отлаживаю метод, я вижу, что в списке есть файлы, и они также имеют ContentLength 123233. Затем я преобразую это в байты, чтобы сохранить в базе данных.

Однако, когда я сохраняю его в базе данных, имя файла и связанный с ним идентификатор рабочего места вставляются по-умолчанию, но байты для изображений равны 0x00000 ... бесконечно 0.

Когда я анализирую их в представлении, у меня нет изображения. почему мой код не сохраняет байты, а только 00000 ...?

вот мой код.

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(PostJobViewModel JobModel, List<HttpPostedFileBase> jobImages)
    {

        if (User.Identity.Name == "")
        {
            return RedirectToAction("Login","Account");
        }
        else
        {

            var uId = (from u in _context.Users where u.Email == User.Identity.Name select u.Id).First();
            var isNull = true;
            var tmpIsNull = true;
            foreach (var item in jobImages)
            {

                if (item == null)
                {
                    isNull = true;
                }
                else
                {
                    isNull = false;
                    tmpIsNull = isNull;
                }
            }
            ApplicationUser userObj = _context.Users.Single(u => u.Id == uId);
            if (isNull && tmpIsNull == true)
            {

                if (ModelState.IsValid)
                {
                        var newJob = new JobPost
                        {
                            Category = JobModel.Category,
                            JobAddress = JobModel.JobAddress,
                            AboutJob = JobModel.AboutJob,
                            JobCity = JobModel.JobCity,
                            JobPostCode = JobModel.JobPostCode,
                            Headline = JobModel.Headline,
                            dateJobPosted=DateTime.Now,
                            UserId = uId,
                            User= userObj,
                            JobService = JobModel.JobService

                        };
                    _context.jobPosts.Add(newJob);
                    _context.SaveChanges();
                }

            }
            else
            {


                if (ModelState.IsValid)
                {


                    var newJob = new JobPost {
                        Category = JobModel.Category,
                        JobAddress = JobModel.JobAddress,
                        AboutJob = JobModel.AboutJob,
                        JobCity = JobModel.JobCity,
                        JobPostCode = JobModel.JobPostCode,
                        dateJobPosted = DateTime.Now,
                        UserId = uId,
                        Headline = JobModel.Headline,
                        User = userObj,
                        JobService=JobModel.JobService

                    };

                    _context.jobPosts.Add(newJob);    
                    _context.SaveChanges();

                    // Retrieve job post to add the images to the post

                    JobPost post = _context.jobPosts.Single(j => j.JobPostId == newJob.JobPostId);

                    foreach (var item in jobImages)
                    {
                        if (item!=null)
                        {
                            JobImage img = new JobImage
                                {
                                    JobFileName=item.FileName,
                                    JobImageContentBytes= new byte[item.ContentLength],
                                    JobPost = post
                                };
                            _context.jobImages.Add(img);
                        }


                    }

                    _context.SaveChanges();



                }
                else
                {
                    return View(JobModel);
                }
            }



        }








        var whatWorkToBeDone = new SelectList(_context.JobWizardCategories, "WhatToDoneId", "WhatToDoneItem");
        ViewBag.whatWorkToBeDone = whatWorkToBeDone;

        return View();
    }

модель

 public class PostJobViewModel
{

    [Required]
    public WorkCategory Category { get; set; }
    [Required]
    public string Headline { get; set; }
    [Required]
    public string JobAddress { get; set; }

    [Required]
    public string AboutJob { get; set; }
    [Required]
    public string JobCity { get; set; }
    [Required]
    public string JobPostCode { get; set; }

    public ServiceCategory JobService { get; set; }
}

просмотр

@model  FinalWorkFinder.Models.ManageAccountCombinedViewModel
 @{
   ViewBag.Title = "Dashboard";
 }

 <section class="my-posted-jobs">

<h1 class="my-posted-jobs-title">@ViewBag.myJobsTitle</h1>
<div class="border-job"></div>
<ul class="my-jobs-section">
    @foreach (var item in Model.MyPostedJobsViewModel)
    {
        <li class="separate-job">
            <div class="content-li">
                <h2 class="content-li-headline">@item.Headline</h2>
                <div class="pictures-li">
                    @{

                        foreach (var pic in item.JobPictures)
                        {
                            //base 64 img to screen
                            if (pic != null)
                            {
                                var base64 = 
       Convert.ToBase64String(pic.JobImageContentBytes);
                                var img = 
           string.Format("data:image/jpg;base64,{0}", base64);
                                <img class="posted-pic" src="@img" alt="" 
        />
                            }

                        }

                    }
                </div>
                <div class="job-date-li">@item.PostedDate</div>
            </div>
        </li>
    }
</ul>


         </section>

модель.

 public class ManageAccountCombinedViewModel
{
    public List<MyPostedJobsViewModel> MyPostedJobsViewModel { get; set; }

}

модель

public class MyPostedJobsViewModel
{
    public string Headline { get; set; }
    public DateTime PostedDate { get; set; }
    public List<JobPicturesViewModel> JobPictures { get; set; }
}

модель

 public class JobPicturesViewModel
{
    public byte[] JobImageContentBytes { get; set; }
}

1 Ответ

3 голосов
/ 04 мая 2019

Вы не прочитали содержимое файла на byte[], измените код для чтения содержимого на

foreach (var item in jobImages)
 {
        if (item!=null)
        {
           byte[] uploadedFile = new byte[item.InputStream.Length];
           item.InputStream.Read(uploadedFile, 0, uploadedFile.Length);
           JobImage img = new JobImage
                          {
                              JobFileName=item.FileName,
                              JobImageContentBytes= uploadedFile,
                              JobPost = post
                          };
           _context.jobImages.Add(img);
         }
}
...