Как загрузить изображение из ViewModel в базу данных - PullRequest
1 голос
/ 10 ноября 2019

Я отправляю вам ссылку на предыдущий пост здесь.

Как вставить данные из ViewModel в базу данных с помощью раскрывающегося списка в View

Теперь проблема связана с передачей параметров изображения.

Я бынравится загружать фотографию в основную модель с помощью ViewModel для отправки данных в базу данных. Это не массовая передача файлов, только отдельные файлы в таблицу.

Оба параметра модели установлены на:

[Display(Name ="Photo")]
public byte[] Photo { get; set; }

Я пытался установить модели в соответствии с Microsoft ASP.NET Corev 2.2 документация

Моя попытка контроллера [HttpPost]:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(... , byte[] Photo, IFormFile Image)
        {
            ObjectABC abc = new ObjectABC ();
            ObjectViewModel model = new ObjectViewModel ();

            if (ModelState.IsValid)
            {
                if (... && Image != null)
                {
                    ...
                    abc.Photo = Photo;

                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
            }  

            Photo = null;

             using (var memoryStream = new MemoryStream())
             {
                 Image.CopyTo(memoryStream);
                 Photo = memoryStream.ToArray();
             }

            ...
            model.Photo = Photo;

            return View(model);
        }

для контроллера [HttpGet] Я ничего не установил, я оставил его, как предлагалось в предыдущем решении. вид части:

...
            <div class="form-gr">
                <input type="file" asp-for="Photo" class="form-control" />
                <label asp-for="Photo" class="control-label">Browse...</label>
                <span asp-validation-for="Photo" class="text-danger"></span>
            </div>
...

Все выглядит нормально, но программа говорит:

NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

...

+

             Image.CopyTo(memoryStream);

Где он настроен неправильно, по какой причине у меня такой результат? Есть идеи?

1 Ответ

0 голосов
/ 11 ноября 2019

В конце концов, я отказался от VARBINARY (MAX) и изменил базу данных на строковую для хранения имен файлов. Я знаю, что это менее безопасно. Но хорошо, что это работает. Мое решение:

В моделях, которые я изменил с байта [] на строку

Контроллер:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(... IFormFile Photo)
        {
            ObjectViewModel model = new ObjectViewModel ();


            if (ModelState.IsValid)
            {
                string uidFileName = null;

                if (... && Photo != null)
                {
                    string uploadFolder = Path.Combine(hostingEnvironment.WebRootPath, "images");
                    uidFileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(Photo.FileName);
                    string filePath = Path.Combine(uploadFolder, uidFileName);
                    Photo.CopyTo(new FileStream(filePath, FileMode.Create));

                    ObjectABC abc = new ObjectABC()
                    {
                        ...
                        Photo = uidFileName
                    };

                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
            }           

           ...

            ...
            model.Photo = Photo;

            return View(model);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...