mpuntel 0 Denunciar post Postado Fevereiro 12, 2008 Gostaria de ver se alguém já passou por algo assim e que possa me dar uma luz do que fazer... Antes que me digam pra fazer upload da imagem pro servidor e salvar apenas o nome no banco e exibir posteriormente, já digo desde agora que era assim mas preciso que as imagens fiquem no banco por requisitos de cliente. Já havia feito um sistema usando handler. Funcionou perfeitamente. Só agora, usando outro sistema não quer funcionar! Já tentei de tudo. Com handler; direto na página aspx; e outros. Tudo que achei na net tentei sem sucesso. Por isso estou começando a pensar que pode ser algum detalhe que eu tinha configurado na outra máquina na qual havia feito o sistema que funcionou. Vou colocar abaixo as formas que tentei: 1ª: usando handler com vb CODE <%@ WebHandler Language="VB" Class="img" %> Imports System Imports System.Web Public Class img : Implements IHttpHandler Dim imagem As String Dim tabela As String Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest Dim dr As Data.SqlClient.SqlDataReader imagem = context.Request.QueryString("i") tabela = context.Request.QueryString("t") Dim cmdFoto As New Data.SqlClient.SqlCommand("select " & imagem & " from " & tabela & " where cod=@codigo") Dim cn As New Data.SqlClient.SqlConnection cn.ConnectionString = ConfigurationManager.ConnectionStrings("nome_da_string").ConnectionString cmdFoto.Parameters.Add("@codigo", Data.SqlDbType.Int) cmdFoto.Parameters("@codigo").Value = context.Request.QueryString("id") cmdFoto.Connection = cn cn.Open() dr = cmdFoto.ExecuteReader(Data.CommandBehavior.SequentialAccess) context.Response.ContentType = "image/gif" dr.Read() context.Response.BinaryWrite(dr("logo")) dr.Close() cn.Close() End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class 2ª: usando handler com c# CODE <%@ WebHandler Language="C#" Class="Imagens" %> using System; using System.Web; using System.Data; using System.Data.SqlClient; using System.IO; using System.Drawing; using System.Drawing.Imaging; public class Imagens : IHttpHandler { public void ProcessRequest(HttpContext context) { SqlCommand CMD; SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["nome_da_string"].ConnectionString); try { Conn.Open(); SqlDataReader DR; string imagem = context.Request.QueryString["i"]; string tabela = context.Request.QueryString["t"]; context.Response.ContentType = "image/gif"; CMD = new SqlCommand("SELECT " + imagem + " FROM " + tabela + " WHERE cod = @cod", Conn); CMD.CommandType = CommandType.Text; CMD.Parameters.AddWithValue("@cod", context.Request.QueryString["id"]); DR = CMD.ExecuteReader(); if (DR.Read()) context.Response.BinaryWrite((byte[])DR["image"]); DR.Close(); DR.Dispose(); CMD.Dispose(); } catch (Exception ex) { string msg = ex.Message.ToString(); } finally { Conn.Close(); Conn.Dispose(); } } public bool IsReusable{ get{ return false; } } public bool ThumbnailCallback(){ return true; } } 3ª: usando aspx CODE using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class ExibirImagem : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string strCon = ConfigurationManager.ConnectionStrings["nome_da_string"].ConnectionString; SqlConnection conexao = new SqlConnection(strCon); conexao.Open(); SqlDataReader dr = null; string sql = "Select logo from tabela where cod=@cod"; SqlCommand cmd = new SqlCommand(sql, conexao); cmd.Parameters.AddWithValue("@cod", Request.QueryString["id"]); try { byte[] logo = (byte[])dr["logo"]; dr = cmd.ExecuteReader(); if (dr.Read() && dr["logo"]!=null) { Response.ContentType = "image/gif"; Response.BinaryWrite(logo); } else { Response.Write("sem registro"); } } catch (Exception ex) { //Response.Write("except. " + ex.Message.ToString()); } finally { conexao.Close(); if (dr != null) dr.Close(); } } } Tentei acessar imgeurl tanto em tempo real quanto no page_load: imgLogo.ImgeUrl = "img.ashx?id=6&i=logo&t=emp"; ou imgLogo.ImgeUrl = "ExibirImagem.aspx?id=6"; Nenhum deles retorna nada. A imagem nunca é "escrita" no html. Alguém saberia o que pode ser? Desde já agredeço. Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Fevereiro 12, 2008 Já abriu sua página diretamente no navegador para ver se esta mostrando a imagem na tela? Faça esse teste para saber exatamente onde esta o problema. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
mpuntel 0 Denunciar post Postado Fevereiro 12, 2008 Sim, já tentei quintelab. Abrindo o handler aparece na tela "System.Byte[]", só. Abrindo a aspx vai pro exception com a seguinte mensagem: Referência de objeto não definida para uma instância de um objeto. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Fevereiro 13, 2008 Eu testei sua página aspx Você fez o mais dificil, o erro esta na posiçao das suas linhas, mas lógico atrapalha e muito. Só uma observação eu testei seu código no banco Sql Server usando um campo do tipo Image. Seu código esta da seguinte forma: byte[] logo = (byte[])dr["logo"]; dr = cmd.ExecuteReader(); if (dr.Read() && dr["logo"]!=null){ Ai esta o erro, como você vai acessar a coluna logo se nem executou o reader ainda, e primeiro alimenta a variável logo para depois verificar se o seu select traz registros. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif O código correto fica: Dr = cmd.ExecuteReader(); if (dr.Read() && dr["logo"]!=null){ byte[] logo = (byte[])dr["logo"]; Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
mpuntel 0 Denunciar post Postado Fevereiro 13, 2008 Boa quintelab, estava tão atucanado com esse pepino que nem vi isso. Mas agora com as alterações que você deu, dá a seguinte mensagem: A imagem “http://localhost:8081/exibirimagem.aspx” contém erros e não pode ser exibida. Estou começando a achar que a imagem não está sendo salva corretamente no banco. O que acha? Não havia pensando nisso pois está bem belo lá <binary data> e achei que estaria devidamente salva. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
mpuntel 0 Denunciar post Postado Fevereiro 13, 2008 quintelab, era imagem gravada no banco errada mesmo. Agora está exibindo em handler e em aspx. Estava gravando via InputStream e mudei pra direto filebytes. Não sabia nem sei por quê e as diferenças, mas que deu certo agora, deu. Obrigado pela ajuda. Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Fevereiro 13, 2008 Sql Server conheço o básico, talvez o pessoal da sessão de Sql Server te auxilie nesta diferença. Mas o importante é que o código em .Net agora esta certo. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites