Загрузка изображения в базу данных возвращает ноль или ошибку - PullRequest
0 голосов
/ 08 апреля 2020

В течение нескольких часов я пытался написать код, который позволял бы загружать фотографии в базу данных, но либо ничего не добавляется в базу данных, либо это вызывает ошибку:

[имя файла] значение недействительно

Мой Restauracja.cs файл:

[Required(ErrorMessage = "Wybierz plik")]
[MaxLength(30, ErrorMessage = "vxvxcvcxvxxx")]
[Display(Name = "Zdjecia")]
public string LinkZdjecia { get; set; }

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

Контроллер RestauracjaController.cs :

public class RestauracjaController : Controller
{
    private readonly FirmaContext _context;

    public RestauracjaController(FirmaContext context)
    {
        _context = context;
    }

   public async Task<IActionResult> Create(Restauracja restauracja, List<IFormFile> Photo)
    {
        foreach (var item in Photo)
        {
            if (item.Length > 0)
            {
                using (var stream = new MemoryStream())
                {
                    await item.CopyToAsync(stream);
                    restauracja.Photo = stream.ToArray();
                }
            }
        }

        return View(restauracja);
    }
}

Просмотр Create.cs :

<form asp-action="Create">
  <div class="form-group">
                <label asp-for="LinkZdjecia" class="control-label"></label>
                <input asp-for="LinkZdjecia" class="form-control" />
                <span asp-validation-for="LinkZdjecia" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Photo" class="control-label"></label>
                <input name="Image" id="Imageinput" class="form-control" type="file" />
                <span asp-validation-for="Photo" class="text-danger"></span>
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
</form>

В этом случае я получил ошибку:

Недопустимое значение [имя файла]

Во втором случае в базу данных сохраняется null (на фото). Контроллер RestauracjaController.cs :

 public async Task<IActionResult> Create(Restauracja restauracja, IFormFile Image)
    {
        if (ModelState.IsValid)
        {
            using (var ms = new MemoryStream())
            {
                Image.CopyTo(ms);
                restauracja.Photo = ms.ToArray();
            }

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Как сказал @TS в первом комментарии к вашему вопросу, в вашем коде много потенциальных проблем, поэтому трудно ответить без необходимости полного обзора кода, который выходит за рамки SO. Вот некоторые проблемы, которые я вижу:

  1. тип Photo должен быть IFormFile, а не byte[].

  2. Почему действие Create принимает второй параметр List<IFormFile> Photo? Если вам нужно несколько изображений, измените make Restauracja.Photo на IEnumerable<IFormFile> и удалите второй параметр в Create. Но сейчас начните с одного изображения, сделайте так, чтобы оно работало, а затем попытайтесь изменить его на несколько изображений.

  3. Почему вы дали input имя Image? В модели нет такого свойства. Измените его на Photo и используйте помощник по тегам.

Вот так:

<input asp-for="Photo" class="form-control" />

Существуют и другие проблемы, но приведенные выше помогут вам.

1 голос
/ 08 апреля 2020

Попробуйте этот код:

public class RestauracjaController : Controller
{
    private readonly FirmaContext _context;

    public RestauracjaController(FirmaContext context)
    {
        _context = context;
    }

   public async Task<IActionResult> Create(Restauracja restauracja, List<IFormFile> Photo)
    {
        foreach (var item in Photo)
        {
            if (item.Length > 0)
            {
                byte[] result = null;
                using (var readStream = item.OpenReadStream())
                using (var stream = new MemoryStream())
                {
                    readStream.CopyTo(stream);
                    result = readStream.ToArray();

                    //restauracja.Photo = result;
                    //_context.Add(restauracja);
                }
            }
        }

        return View(restauracja);
    }

}

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