2014-10-15 2 views
0

У меня есть БД с 3 таблицами, одна из которых загружает изображения от пользователей с каждой страницей профиля. Мне удалось показать изображения с gridview в логине и поиске, но это не было очень приятно для глаз, поэтому я решил следовать asp: image method :)C# показать конкретное изображение из базы данных с обработчиком

Что я не могу сделать сейчас, показывается изображение, связанное с входом пользователя или профилем пользователя, который был показан после поиска ,

Итак, если я нахожу способ передать идентификатор обработчику? или...?

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

Default.aspx.cs (материал происходит в ImageUpload() и ImagebindGrid() я обошел GridView код, так что я могу попытаться показать его другим способом.

using System; 
using System.Web; 
using System.Data.SqlClient; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web.Security; 
using System.Security.Principal; 
using System.Data.Common; 



namespace DisplayingImages 
{ 
public partial class Default : System.Web.UI.Page 
{ 

    public string query, constr, query1, query2, query3; 
    public SqlConnection con, conn; 
    public void connection() 
    { 
     constr = ConfigurationManager.ConnectionStrings["Myconnection"].ToString(); 
     con = new SqlConnection(constr); 
     con.Open(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label1.Visible = false; 
     if (!IsPostBack) 
     { 


      EM = (string)(Session["Email_Account"]); 
      lblemail.Text = EM; 
      SN = Convert.ToString(Session["Surname"]); 
      lblname.Text = SN; 
      PS = (string)(Session["Password"]); 
      PID = (int)(Session["id"]); 
      HttpContext context = HttpContext.Current; 
      context.Session["Email_Account"] = EM; 
      EM = (string)(context.Session["Email_Account"]); 
      if (PID == null) 
      { 
       Response.Redirect("Login.aspx"); 
      } 
      imagebindGrid(); 
      PostSelection(); 


     } 
    } 

    private void InitializeComponent() 
    { 
     throw new NotImplementedException(); 
    } 


    protected void upload(object sender, EventArgs e) // button για το upload της φωτο. Καλειται η κλαση Imageupload() 
    { 

     Imageupload(); 
    } 
    /* Κλασση για upload εικονας . Ελεγχος και περασμα εικονας */ 
    private void Imageupload() 
    { 
     if (FileUpload1.HasFile) 
     { 
      PID = (int)(Session["id"]); 
      if (PID != null) 
      { 
       int imagefilelenth = FileUpload1.PostedFile.ContentLength; 
       byte[] imgarray = new byte[imagefilelenth]; 
       HttpPostedFile image = FileUpload1.PostedFile; 
       image.InputStream.Read(imgarray, 0, imagefilelenth); 
       connection(); 
       query = "Insert into ImageToDB (user_id,ImageName,Image) values (@user_id,@Name,@Image)"; 
       SqlCommand com = new SqlCommand(query, con); 
       com.Parameters.AddWithValue("@Name", SqlDbType.VarChar).Value = TextBox1.Text; 
       com.Parameters.AddWithValue("@Image", SqlDbType.Image).Value = imgarray; 
       com.Parameters.AddWithValue("@user_id", PID); 
       com.ExecuteNonQuery(); 
       Label1.Visible = true; 
       Label1.Text = "Image Is Uploaded successfully"; 
       imagebindGrid(); 

      } 
     } 
    } 
    /* Gridview για εικονες */ 
    public void imagebindGrid() 
    { 
     connection(); 
     query = "Select id,ImageName,Image from ImageToDB where user_id= " + PID; 
     SqlCommand com = new SqlCommand(query, con); 
     SqlDataReader dr = com.ExecuteReader(); 
     //Image.ImageUrl = "/Handler.ashx?id_Image=" + PID.ToString();  


     //Gridview1.DataSource = dr; 
     //Gridview1.DataBind(); 


    } 
    /*Logout Button */ 
    protected void Button1_Click(object sender, EventArgs e) 
    { 

     System.Web.Security.FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.RemoveAll(); 
     Session.Abandon(); 
     Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Cache.SetNoStore(); 
     HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     HttpContext.Current.Response.AddHeader("Pragma", "no-cache"); 
     HttpContext.Current.Response.AddHeader("Expires", "0"); 
     FormsAuthentication.SignOut(); 
     HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(string.Empty), null); 
     Response.Redirect("~/Logout.aspx"); 
    } 
    /* Κλασση για το Post */ 
    private void Txt() 
    { 
     try 
     { 
      PID = (int)(Session["id"]); 
      if (PID != null) 
      { 
       connection(); 
       query1 = "Insert into Posttext (user_id,Posttext) values (@user_id,@Your_Post)"; 
       SqlCommand com2 = new SqlCommand(query1, con); 
       com2.Parameters.AddWithValue("@Your_Post", SqlDbType.VarChar).Value = PostBox.Text; 
       com2.Parameters.AddWithValue("@user_id", PID); 
       com2.ExecuteNonQuery(); 
       lbluser.Text = PostBox.Text; 
       PostSelection(); 
      } 

     } 



     catch (Exception ex) 
     { 
      //con.Close(); 
     } 

    } 
    /* Κανει select τα κειμενα και τα ανεβαζει απο την βαση στο grid */ 
    public void PostSelection() 
    { 
     connection(); 

     query2 = "Select Posttext from Posttext where user_id= " + PID; 
     SqlCommand com1 = new SqlCommand(query2, con); 
     SqlDataReader Read = com1.ExecuteReader(); 
     grdemployee7.DataSource = Read; 
     grdemployee7.DataBind(); 
     Read.Close(); 

    } 
    /* Καλειται η Txt() για να γινει το Post */ 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     Txt(); 
    } 

    public string USER_PID { get; set; } 
    public DateTime _myid { get; set; } 

    /* --------------------Κουμπι για search PROFILE -----------------------------------*/ 
    public void Button3_Click1(object sender, EventArgs e) 
    { 
       Response.Redirect("~/WebForm7.aspx"); 
    } 

    public string SN { get; set; } 
    public string PS { get; set; } 
    public string EM { get; set; } 
    public int PID { get; set; } 

    protected void PostBox_TextChanged(object sender, EventArgs e) 
    { 

    } 
} 
} 

вот мой обработчик

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 

namespace DisplayingImages 
{ 
/// <summary> 
/// Summary description for Handler1 
/// this application is created by vithal wadje for C# corner 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

public class Handler1 : IHttpHandler 
{ 
    //createting the object of Default.aspx class page to 
    //call connection and use strings variable 
    Default cls = new Default(); 

    public void ProcessRequest(HttpContext context) 
    { 
     //storing the querystring value that comes from Defaul.aspx page 

     string displayimgid = context.Request.QueryString["id_Image"].ToString(); 
     cls.connection(); 
     //retriving the images on the basis of id of uploaded 
     //images,by using the querysting valaues which comes from Defaut.aspx page 
     cls.query = "select Image from ImageToDB where id=" + displayimgid; 
     SqlCommand com = new SqlCommand(cls.query, cls.con); 
     SqlDataReader dr = com.ExecuteReader(); 
     dr.Read(); 
     context.Response.BinaryWrite((Byte[])dr[0]); 
     context.Response.End(); 

    } 

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

и вот так я стараюсь передать идентификатор

<asp:Image ID="Image" runat="server" ImageUrl='<%# "Handler1.ashx?id_Image="+ Eval("id") %>' "/> 

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

Еще раз спасибо!

+0

Что происходит, когда вы выполняете этот обработчик непосредственно в своем браузере? –

+1

Обратите внимание, что у вас есть уязвимость в SQL-инъекции в коде. Вы никогда не должны рассматривать ввод пользователя как * исполняемый код SQL *. (В некоторых ваших запросах вы уже используете параметры, чтобы предотвратить это. Почему бы не использовать их во всех * ваших запросах?) Подробнее ... Где/как именно этот код выходит из строя? Правильно ли отображается URL-адрес? Правильно ли он запрашивает обработчик? Является ли обработчик ответом на данные изображения? Где проблема? – David

+0

Да, я исправлю все эти неуверенности SQL, спасибо за упоминание! :) – frcake

ответ

0

Для этого вам необходимо установить contenttype. Иначе это будет только двоично. Использовать это .

context.Response.ContentType = "image/png";

Это зависит от того, какой тип изображения вы пишете. Таким образом, на основе этого использования image/jpg и т.д.

Помимо этого, я могу видеть в вашем коде, вы использовали imagebindGrid привязать изображение к сетке с помощью запроса на SQL, но вы не использовали dr.Read() перед привязкой к сетке, это не открывать набор строк, и, следовательно, данные не связываются, и вы не видите нового изображения. Поэтому новый код будет похож на следующий.

SqlDataReader dr = com.ExecuteReader(); 
dr.Read(); 
Gridview1.DataSource = dr; 
Gridview1.DataBind(); 

Если вы можете показать aspx код, в котором у вас есть Gridview1, что будет более полезным, чтобы помочь вам, в случае, если вы сталкиваетесь проблемы после изменения этого.

+0

Да, но это не настоящий файл изображения, и вы перехватываете его, поэтому в перехватчике должен быть установлен тип контента. Чтобы проверить это, загрузите страницу с

+0

Поскольку браузеру нужно интерпретировать двоичные данные как изображение, иначе это просто текстовый ответ на браузер, вы можете увидеть консоль браузера, он скажет эту ошибку, см. Некоторые полезные сообщения - http://stackoverflow.com/questions/3467404/ chrome-says-resource-interped-as-script-but-transfer-with -mime-type-text, это может быть не связано с проблемой OP, но все же хороший пример того, что я пытаюсь объяснить. –

+0

Возможно, вы правы. Удалит комментарий. Пусть OP проверяет это. –

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