2009-11-18 5 views
3

У меня есть представление, которое содержит идентификатор пользователя и столбец изображения.Отображение изображения из базы данных в asp.net mvc

Вот что я пытался сделать, чтобы получить изображение, но я продолжаю получать коробку с красным x вместо фактического изображения.

Посмотреть

<td><img src="<%= Url.Action("DisplayImage" , "User" , new { id = item.id}) %>" alt="" /></td> 

Контроллер

public FileContentResult DisplayImage(string id) 
    { 
     byte[] image = repository.GetImage(id); 
     return File(image, "image/jpg"); 
    } 

я также пытался возвращающий ActionResult вместо этого и что не работает.

Repository

public Byte[] GetImage(string id) 
    { 

     var image = db.GetImage(id).First<GetImageResult>(); 

     if (image == null) 
      return null; 
     return image.UserImage; 
    } 

LinqToSql Класс

[Function(Name="dbo.GetImage")] 
public ISingleResult<GetImageResult> GetImage([Parameter(DbType="VarChar(8)")] string id) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), id); 
    return ((ISingleResult<GetImageResult>)(result.ReturnValue)); 
} 

public partial class GetImageResult 
{ 
    private System.Byte[] _userImage; 

    public GetImageResult() 
    { 
    } 


    [Column(Storage="_userImage", DbType="Image")] 
    public System.Byte[] UserImage 
    { 
     get 
     { 
      return this._userImage; 
     } 
     set 
     { 
      if ((this. _userImage!= value)) 
      { 
       this. _userImage = value; 
      } 
     } 
    } 
} 

Я убиваю себя весь день, пытаясь получить эту работу, но он просто не работает. Тип возвращаемого значения хранимой процедуры является целым числом (по крайней мере, когда я смотрю на параметры в SQL Server Management Studio, он говорит integer), но я не могу переопределить, что теперь могу?

На самом деле он нажимает на действие DisplayImage с правильными параметрами в UserController и возвращает File (imageByteArray, «image/jpg»), но отображается только поле с красным x. Любая помощь будет принята с благодарностью.

Редактирование: Я попытался отлаживать, добавив в результат действия Reponse.BinaryWrite (imageByteArray) и нажав на URL-адрес напрямую с помощью goign до http://localhost/User/DisplayImage?id=10101010, и изображение для этого пользователя отображается в mspaint.

edit2: Я также сделал источник просмотра, и мой html для этого тега изображения вышел следующим образом.

<td> 
    <img src='/User.mvc/GetImage?id=U00915441' alt="" /> 
</td> 

Благодаря

+0

У меня возникла такая проблема, когда он просто попытался найти изображение по пути, а не от Маршрута. Вы пробовали отладку, чтобы проверить, входит ли приложение в контроллер? –

+0

Он нажимает на действие контроллера DisplayImage (строковый идентификатор), и он проходит через него без проблем. – zSynopsis

+0

тоже используйте скрипач, чтобы точно увидеть, что возвращается на провод. –

ответ

3

Посмотрите на этот вопрос, который я имел от некоторого времени назад - решение было special ActionResult type for images

Edit: Вот мой код. Я на самом деле создание класса ImageResult из образа, который я создал с GDI +, как это:

return new ImageResult() 
{ 
     ImageFormat = spriteInfo.ImageFormat, 
     EncodedImageBytes = spriteInfo.GetImageStream() 
}; 

Изображение Результат класса. Вы заметите, что если я предоставил параметр EncodedImageBytes, он отправит это в выходной поток. Это похоже на то, что вы хотите. С другой стороны, если вы просто передаете изображение, он просто напишет, что изображение выйдет в выходной поток.

public class ImageResult : ActionResult 
    { 
     public ImageResult() { } 
     public int? Quality { get; set; } 
     public Image Image { get; set; } 
     public ImageFormat ImageFormat { get; set; } 
     public byte[] EncodedImageBytes { get; set; } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      // verify properties 
      if (EncodedImageBytes == null) 
      { 
       if (Image == null) 
       { 
        throw new ArgumentNullException("Image"); 
       } 
      } 
      if (ImageFormat == null) 
      { 
       throw new ArgumentNullException("ImageFormat"); 
      } 
      // output 
      context.HttpContext.Response.Clear(); 

      if (ImageFormat.Equals(ImageFormat.Bmp)) context.HttpContext.Response.ContentType = "image/bmp"; 
      if (ImageFormat.Equals(ImageFormat.Gif)) context.HttpContext.Response.ContentType = "image/gif"; 
      if (ImageFormat.Equals(ImageFormat.Icon)) context.HttpContext.Response.ContentType = "image/vnd.microsoft.icon"; 
      if (ImageFormat.Equals(ImageFormat.Jpeg)) context.HttpContext.Response.ContentType = "image/jpeg"; 
      if (ImageFormat.Equals(ImageFormat.Png)) context.HttpContext.Response.ContentType = "image/png"; 
      if (ImageFormat.Equals(ImageFormat.Tiff)) context.HttpContext.Response.ContentType = "image/tiff"; 
      if (ImageFormat.Equals(ImageFormat.Wmf)) context.HttpContext.Response.ContentType = "image/wmf"; 

      // output stream 
      Stream outputStream = context.HttpContext.Response.OutputStream; 
      if (EncodedImageBytes != null) 
      { 
       outputStream.Write(EncodedImageBytes, 0, EncodedImageBytes.Length); 
      } 
      else 
      { 
       ImageUtil.SaveImageToStream(outputStream, Image, ImageFormat, Quality); 
      } 
     } 

    } 
+0

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

+0

Спасибо. Не могли бы вы высказать какой-то код? – zSynopsis

+0

надеюсь, что это поможет –

Смежные вопросы