Трудности с отправкой файла для просмотра с использованием метода действия FileContentResult

Мне нужно отобразить изображение в представлении таким образом

<img src = <% = Url.Action("GetImage", "Home", new { productID })%>

Это действие, которое должно предоставить данные

public FileContentResult GetImage(int ID)
{
  var img = db.Images.Where(p => p.ID == ID).First();
  return File(img.ImageData, img.ImageMimeType);
}

Этот пример взят из Pro ASPNET.NET MVC (Стивен Сандерсон / APress). Я получаю следующую ошибку: Лучшее совпадение метода перегрузки для System.Web.Mvc.Controller.File (строка, строка) имеет недопустимый аргумент. Невозможно преобразовать из System.Data. Linq.Binary в строку.

Тем не менее, intellisense сообщает мне, что существует метод перегрузки (byte [] filecontents, string fileType). Но когда я пишу приведенный выше код, я получаю сообщение об ошибке. Я что-то упускаю?

ИЗМЕНИТЬ

Спасибо за ответ. У меня возникла аналогичная проблема при загрузке файла изображения. Вот мой метод действий

public ActionResult AddImage(HttpPostedFileBase image)
{
  if(image != null)
    {
      var img = new Image();//This Image class has been 
                            //created by the DataContext
      img.ImageMimeType = image.ImageMimeType
      img.ImageData = new byte[image.ContentLength];
      image.InputStream.Read(img.ImageData, 0, image.ContentLength);
    } 
}

Я получаю ошибку для последней строки: «image.InputStream.Read (myImage.ImageData, 0, image.ContentLength);» Он говорит, что не может преобразовать System.Data.Linq. Из двоичного в байтовый []

Я сделал следующее: (i) создал новый класс под названием ImageDataClass, (ii) проделал указанную выше операцию с этим классом, (iii) выполнил явное преобразование из ImageDataClass в Image и (iv) сохранить в БД с помощью Linq.

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

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


person Richard77    schedule 06.07.2010    source источник


Ответы (1)


Существует перегрузка для File(), которая принимает массив байтов, но вы пытаетесь передать тип System.Data.Linq.Binary, а не массив байтов. Однако на Binary есть метод преобразования в массив байтов.

Попробуй это:

public FileContentResult GetImage(int ID)
{
  var img = db.Images.Where(p => p.ID == ID).First();
  return File(img.ImageData.ToArray(), img.ImageMimeType);
}

Причина, по которой в ошибке компиляции упоминается «строка», заключается исключительно в том, что он не может определить, какую перегрузку вы пытались выполнить, поэтому он просто выбирает одну, в данном случае строку, а затем сообщает об ошибке преобразования типа.

[РЕДАКТИРОВАТЬ: в ответ на изменение OP]

У вас должно получиться попробовать что-то вроде этого:

public ActionResult AddImage(HttpPostedFileBase image)
{
  if(image != null)
    {
      var img = new Image();//This Image class has been 
                            //created by the DataContext
      img.ImageMimeType = image.ImageMimeType
      var imageData = new byte[image.ContentLength];
      image.InputStream.Read(imageData, 0, image.ContentLength);
      img.ImageData = new System.Data.Linq.Binary(imageData);
    } 
}

Помните, что хотя System.Data.Linq.Binary, вероятно, является просто байтовым массивом внизу или, по крайней мере, предназначен для представления байтовых данных, он сам не относится к типу byte[]; вам все равно нужно конвертировать в и из (аналогичная ситуация с System.IO.MemoryStream)

person Rob Levine    schedule 06.07.2010
comment
Спасибо за ответ, сработало. У меня есть другая подобная проблема, поэтому, пожалуйста, прочтите РЕДАКТИРОВАНИЕ моего сообщения. - person Richard77; 06.07.2010
comment
Какое полное имя типа Image в приведенном выше примере? Просто хочу поближе познакомиться с доступными методами и свойствами. - person Rob Levine; 06.07.2010
comment
У меня есть таблица изображений в моей БД. После того, как я перетащил его в редактор LinqToSQL, он теряет s и становится Image. Итак, Image - это класс, созданный DataContext. - person Richard77; 06.07.2010
comment
хорошо - значит, ImageMimeType и ImageData являются столбцами в вашей базе данных. Первое, предположительно, строка, а второе двоичное поле ... подождите, пока я быстро думаю :) - person Rob Levine; 06.07.2010
comment
Я попробую и дам вам знать результат. - person Richard77; 06.07.2010