ASP.NET MVC3: загрузить изображение и сохранить его в базе данных - PullRequest
2 голосов
/ 31 августа 2011

Я работаю над книгой Стивена Сандерсона (Pro ASP.NET MVC 3). Я на р. 294. Я скопировал слово за словом в книгу, но оно не работает.

Это метод действия

public ActionResult Edit(Product product, HttpPostedFileBase image)
{
  if(ModelState.IsValid)
  {
    if(image != null)
    {
      product.ImageMimeType = image.ContentType;
      product.ImageData = new byte[image.ContentLength];
      image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
    }

    //...Save product in the database using Entity Framework
  }
}

Это как вывести изображение на страницу бритвы

<img width="150" height="150"
  src = "@Url.Action("GetImage", "Home", new { Model.ProductID })" /> 

И, наконец, GetImage

public FileContentResult GetImage(int productID)
    {
        Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productID);
        if (prod != null)
        {
            return File(prod.ImageData, prod.ImageMimeType);
        }
        else
        {
            return null;
        }
    }

EDIT

Я проследил весь процесс (во время отладки) от начала до конца, и вот что я могу сказать:

  • После того, как я нажал кнопку «Сохранить» в представлении, объект HttpPostedFileBase не является нулевым.

  • После вызова метода db.SaveChanges () в таблицу базы данных добавляется одна строка.

  • Когда я вызываю GetImage, он не возвращает ноль.

  • Но на изображении изображение не отображается

    Спасибо за помощь

Ответы [ 8 ]

2 голосов
/ 31 августа 2011

File должно быть FileContentResult, поскольку это байты, а не фактический файл на диске. И img должно быть prod, верно?

public FileContentResult GetImage(int productID)
{
    Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productID);
    if (prod != null)
    {
        return new FileContentResult(prod.ImageData, prod.ImageMimeType);
    }
    else
    {
        return null;
    }
}
1 голос
/ 17 октября 2011

Измените свой метод действия следующим образом:

<img width="150" height="150" src = "@Url.Action("GetImage", "Home", new { @id = Model.ProductID })" /> 

Кроме этой небольшой разницы (добавление параметра id), ваш код очень похож на мой, и мои изображения загружаются просто отлично. Кстати, если вы посмотрите на источник HTML для вашей страницы, вы видите:

/GetImage/<some number here>

или

/GetImage/

как значение вашего атрибута src? Если последнее, это определенно должно решить проблему. Если первое, вам может потребоваться включить GET запросов.

0 голосов
/ 24 мая 2014

Простой Откройте файл Products.cs в папке ваших сущностей и измените

public byte ImageData {get;set;}

Кому:

public byte[] ImageData{get;set;}
0 голосов
/ 25 октября 2013

проблема в методе Action. Должно быть, вам нужно изменить имя контроллера ... Функция "GetImage" находится в контроллере "Admin". Остальная часть кода в порядке ...

0 голосов
/ 23 августа 2013

Я столкнулся с той же проблемой .. попробуйте это:

public ActionResult Edit(Product product, HttpPostedFileBase image)
{
  if(ModelState.IsValid)
  {
     if(image != null)
     {
       product.ImageMimeType = image.ContentType;
       product.ImageData = new byte[image.ContentLength];

       iname.InputStream.Position = 0; // This is what makes the difference

       image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
     }

//...Save product in the database using Entity Framework

}

0 голосов
/ 08 января 2013

Еще более простое разрешение - просто изменить следующую строку в вашем классе продуктов:

изменить с:

public byte ImageData {get;set;}

На:

public byte[] ImageData{get;set;}
0 голосов
/ 14 марта 2012

У меня тоже была такая же проблема.Просто измените часть метода Edit в контроллере на sth следующим образом:

 if (image != null)
            {
                mvcImages img = db.mvcImages.Where(p => p.p_id == prod.p_id).FirstOrDefault();
                prod.p_imageMimeType = image.ContentType;
                byte[] buffer = new byte[image.ContentLength];
                image.InputStream.Read(buffer, 0, image.ContentLength);
                prod.p_imageData = buffer;
                img.p_imageMimeType = prod.p_imageMimeType;
                img.p_imageData = prod.p_imageData;
                db.SaveChanges();
            }

Это прекрасно работает.Также не забудьте сохранить изменения в тех же скобках, что и ваша команда «if».

0 голосов
/ 06 октября 2011

Вот ответ, чтобы получить пример работы Стивена Сандерсона, измените процедуру сохранения следующим образом:

            if (image != null)
            {

                var product = new Product();

                product.FileName = image.FileName; //<- optional filename
                product.ImageMimeType = image.ContentType;
                int length = image.ContentLength;
                byte[] buffer = new byte[length];
                image.InputStream.Read(buffer, 0, length);
                product.ImageData = buffer;

              //Save product to database 

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