Трудности отправить файл для просмотра с помощью метода действия FileContentResult - PullRequest
0 голосов
/ 06 июля 2010

Мне нужно отобразить на изображении таким образом

<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 . Бинарный в строку.

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

EDIT

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

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.Binary to Byte []

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

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

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

1 Ответ

3 голосов
/ 06 июля 2010

Существует перегрузка для 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);
}

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

[EDIT: в ответ на редактирование 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)

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