Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mpuntel

Imagem de banco não é exibida

Recommended Posts

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.