2013-06-19 1 views
4

Это моя таблица в базе данных:Как показать изображение из базы данных в asp: изображение с linq?

enter image description here

И я прочитал базу данных, как:

DataClassesDataContext db = new DataClassesDataContext(); 
usertable thisuser = db.usertables.First(p => p.username == User.Identity.Name); 

Так, thisuser.picture является дескриптор изображения. Но как я могу показать его в asp: управлении изображениями на моей странице?

Редактировать я сохранить изображение с этим кодом:

DataClassesDataContext db = new DataClassesDataContext(); 
usertable thisuser = db.usertables.First(p => p.username == User.Identity.Name); 
byte[] filebyte = FileUpload1.FileBytes; 
System.Data.Linq.Binary fileBinary = new System.Data.Linq.Binary(filebyte); 
thisuser.picture = fileBinary; 
db.SubmitChanges(); 

там что-то не так?

+0

Какой формат изображений вы используете? Кроме того, 'image' является устаревшим типом в SQL Server - вместо этого вы можете использовать' varbinary'. –

+0

обычно формат изображений 'jpg' – hamed

+0

Я должен сказать, что это идеальный вариант: что вы пробовали ?. Серьезно, сообщение принесло бы много пользы, если бы вы показали нам. – ChiefTwoPencils

ответ

4

Элемент управления ASP.NET Image слабо представляет собой <img> тег в HTML. В результате вы можете получить изображение только в документах HTML, установив URL-адрес содержимого изображения, которое вы хотите вставить на страницу.

<img src="images/picture.png" /> 

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

С ASP.NET Web API это становится тривиальной операцией по реализации:

public HttpResponseMessage GetImage(string username) 
{ 
    DataClassesDataContext db = new DataClassesDataContext(); 
    usertable thisuser = db.usertables.FirstOrDefault(
     p => p.username == username); 

    if (thisuser == null) 
    { 
     return new HttpResponseMessage(HttpStatusCode.NotFound)); 
    } 

    // Create a stream to return to the user. 
    var stream = new MemoryStream(thisuser.picture.ToArray()); 

    // Compose a response containing the image and return to the user. 
    var result = new HttpResponseMessage(); 

    result.Content = new StreamContent(stream); 
    result.Content.Headers.ContentType = 
      new MediaTypeHeaderValue("image/jpeg"); 

    return result; 
} 

Если вы не можете использовать Web API, вы должны реализовать HTTP Handler, чтобы сделать ту же работу.

На странице ASP.NET вам необходимо установить свойство ImageUrl на адрес, настроенный для вашего контроллера/обработчика, включая имя пользователя как часть URL-адреса.

0

если thisuser.picture есть правильный путь к изображению, вы можете попробовать что-то вроде этого:

Image im = new Image(); 
im.ID = "myImg"; 
im.ImageUrl = thisuser.picture.toString(); 
this.Controls.Add(im); 

Я предполагаю, что вы используете веб-форму (я не думаю, что это имеет значение) ,

Кроме того, для этого может потребоваться обновление страницы. «Это» относится к объекту «Страница» (в моем случае).

+0

Присмотритесь к информации о таблице, это не путь, это blob – IvanL

4
<asp:Image ImageUrl='<%# GetImage(Eval("IMG_DATA")) %>' /> 

Выше мы говорим двигатель ASPX, что мы хотим, чтобы принять значение столбца [IMG_DATA], и передать его в метод GetImage страницы, которая должна возвращать верное изображение. Итак, давайте реализуем метод внутри нашего класса страницы:

public string GetImage(object img) 
{ 
    return "data:image/jpg;base64," + Convert.ToBase64String((byte[])img); 
} 
+0

@hamed не работает? – Manish

+0

Великолепно с простым и чисто информационным решением :) –

0

Вы не можете сделать его непосредственно с помощью элемента управления Image ASP.NET (или, по крайней мере, не то, что я сразу знаю). Быстро с головы:

Решение 1: Для ваших изображений вам нужен HttpHandler. В вашем теге asp: image вам нужен ImageUrl, который будет выбран этим конкретным HttpHandler. Там вы можете записать содержимое изображения из базы данных в виде байтов, используя правильный тип MIME и заголовки.

Решение 2: Посмотрите на встраивание данных в URL-, возможно, вы можете написать свой образ, как это и добавить его в аспида: ImageUrl изображения так: https://en.wikipedia.org/wiki/Data_URI_scheme

4

Вам нужно создать общий обработчик - позволяет называть его ImageHandler.ashx, и он будет в корне вашего веб-приложения.

public class ImageHandler : IHttpHandler { 
    public void ProcessRequest(HttpContext context) { 
    // here is the tricky part - you don't store image type anywhere (you should) 
    // assuming jpeg 
    context.Response.ContentType = "image/jpeg"; 

    DataClassesDataContext db = new DataClassesDataContext(); 
    if (HttpContext.Current.User != null && HttpContext.Current.User.Identity != null) { 
     var thisuser = db.usertables.First(p => p.username == HttpContext.Current.User.Identity.Name); 
     if (thisuser != null) { 
     byte[] buffer = thisuser.picture.ToArray(); 
     context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
     } 
    } 
    } 

    public bool IsReusable { 
    get { return false; } 
    } 
} 

Затем на странице, добавьте:

<asp:Image runat="server" ImageUrl="~/ImageHandler.ashx" /> 

Несколько замечаний:

вы должны рассмотреть кэширование изображения

вы должны перейти от типа изображения SQL в VARBINARY (http://msdn.microsoft.com/en-us/library/ms187993.aspx)

вы должны хранить изображение mimetype где-нибудь (если i т является JPEG, PNG, BMP) - предпочтительно в той же таблице, и сервер правильные MimeType в обработчике

    -
0

создать ashx page. Об этом использовать Somthing как этот

public void ProcessRequest(HttpContext context) 
{ 

    context.Response.ContentType = "image/jpeg"; 
    Stream strm = new MemoryStream(GetImage(ID)); 
    long length = strm.Length; 
    byte[] buffer = new byte[length]; 
    int byteSeq = strm.Read(buffer, 0, 2048); 

    while (byteSeq > 0) 
    { 
      context.Response.OutputStream.Write(buffer, 0, byteSeq); 
      byteSeq = strm.Read(buffer, 0, 2048); 
     } 
} 
  1. ПО Получ изображений

    public static byte[] GetImage(string ImageId) 
    { 
        byte[] img = null; 
    
        DataTable dt = new DataTable(); 
        SqlCommand cmd = new SqlCommand(); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.CommandText = "USP_SELECT_GLOBAL_METHOD"; 
        cmd.Parameters.AddWithValue("@EVENT", 5); 
        cmd.Parameters.AddWithValue("@CODE", ImageId); 
        cmd.Connection = DL_CCommon.Connection(); 
        SqlDataReader dr = null; 
        dr = cmd.ExecuteReader(); 
        if (dr.Read()) 
        { 
         img = (byte[])dr[0]; 
        } 
        dr.Close(); 
        return img; 
    } 
    

    этот метод возврата возвращает изображение в виде ур ID.

  2. на странице ASPX ..

    Image1.ImageUrl = "somthing.ashx?ID="+userImageID; 
    

Я надеюсь, что это будет работать. поскольку я нашел, что это сработало в моем собственном. Спасибо

+0

спасибо @hamed за ваше редактирование. – Binod

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