Buscar

Lendo imagens do bd em asp.net

nome

Marcos André Costa

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

Alguém ja tentou, em asp.net, ler imagens do BD no Delphi, 2005 e 2006?
Provavelmente sim, e usando o DBWebImage parece q as coisas são tao fáceis, no entanto, o Borland.Data.Web.dll acaba decepcionando-nos por demais...
O DBWebImage começa a nos dar dor de cabeça em algumas situaç?es:

1. se vc usa cookieless=true, porque o sessionID começa a fazer parte da url da página, e o imageurl do componente nao prevê isto...

2. se vc tentar parametros para a página com imagem, mas... a imagem nao vai aparecer pq a url nao é esperada (a url image esperada é apenas sem parametro algum, um absurdo)

3. se precisares fazer um site do tipo https. Simplesmente tb nao vai funcionar pq a url tb nao espera nada diferente de http:// no inicio da requisição (o http está fixo no c?digo sem sequer algum tipo de checagem)

4. se quiser ter uma pagina de login, por exemplo, vc pode mostrar uma imagem numa pagina, mas e em outra? ai vc dança novamente, pq o DBWebImage adquire a primeira imagem do BD, ok, mas as outras serao as mesmas por usam o mesmo nome de arquivo temporário, incluindo o urlimage, ou seja, nem sequer um httphandler é usado... assim sendo, todas as imagens serão iguais a primeira até q abandones a sessão e inicie outra (este problema não vou nem comentar)...

Bem... neste mesmo dia resolvi o problema no Delphi 8, mas apenas em termos... fiz modificaç?es direto no fonte do componente em C#... finalmente recompilei o Borland.Data.Web.dll... e estava resolvindo, no entanto, apenas até o 3o problema... ou seja, o 4o ainda estava pendente e exigiria um extra de c?digo no original da Borland... entao pensei melhor nao... mais tarde até fiz uns testes q acabaram mostrando q ganhei tempo ao fazer uma solução propria, ao inves de esperar pela Borland q eskeceu destes problemas com o DBWeb até hoje... pois a titulo de curiosidade minha, peguei os fontes alterados e consegui faze-los compilar no 2005 e 2006, no entanto, acabavam dando um erro de PublicKeyToken 91d62ebb5b0d1b1b requerido para o Borland.Data.Web.dll...
ganhei o dia...
ok... aquilo me fez pensar q o DBWeb era feito apenas pra quebrar-galho e nao pra produção forte... sem contar q o Delphi 8 foi feito as pressas pra nao perder espaço na web, ou seja, pensei: "oq a Borland nao faz por n?s, n?s fazemos por ela"... afinal precisamos ajudar a mãe desta ferramenta tão poderosa chamada Delphi...
e foi pensando na proposta de compartilhar o conhecimento, de toda comunidade delphi, q resolvi compartilhar a experiencia abaixo...
O Day After da decepção com o Delphi 8... no dia seguinte, resolvi reinventar a roda, s? q desta vez ela sairia, finalmente, redonda... ;) tudo agora começa a se comportar de forma bem simples, basta colocar um componente server side de imagem, um Image normal da paleta e setar o urlimage como abaixo:

Image1.ImageUrl:= 'readimage.aspx?cd_field=CODIGO_CLIENTE' +
'&cd_value=' + Session[CODIGO_CLIENTE' ].ToString +
'&image_field=FOTO_CLIENTE' +
'&table_name=CLIENTES' +
'&checker=' + IntToStr(((StrToInt(Session['CODIGO_CLIENTE'].ToString) + 8) * 591) + 3008) +
'&noimage=images/sem_foto.jpg';

o checker serve apenas como um cálculo simples para evitar de um cliente ver a foto de outro, por exemplo... ou seja, vc pode colocar a conta q quiser ai, no entanto no readimage.aspx (a nova página necessária) vc deve fazer o calculo inverso pra fechar, se fechar blz ;)...
O segredo disto funcionar é de apenas fazer a readimage.aspx fazer o trabalho pra vc... esta outra página é vazia, nao tem componente algum, pq aki vc vai trabalhar direto com bits para o browser e, isto mesmo, o browser q se vire ;) na readimage.aspx vc s? precisa dar instruç?es no Page_Load, como segue abaixo:
obs.: os tipos conexão ao BD podem variar de acordo com o servidor de BD, ou seja, aqui usei os componentes q poderão servir pra qq um q use ODBC, ou seja, nao deve ter nenhum bd q seja realmente bd q nao tenha odbc via connectionstring...

procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
Var
CD_VALUE,CD_FIELD,IMAGE_FIELD,TABLE_NAME:String;
CHECKER:LongInt;
SQLConn:SQLConnection;
SQLCmd:SQLCommand;
SQLDtR:SQLDataReader;
Buf:TBytes;
FieldNum,BufSize,ImageFinder:Integer;
begin
CHECKER:=((StrToInt(Request.QueryString.Get('checker')) - 3008) Div 591) - 8;
CD_VALUE:=Request.QueryString.Get('cd_value');

If CHECKER <> StrToInt(CD_VALUE) then
Begin
Response.Redirect(Request.QueryString.Get('noimage'));
Exit;
End;

CD_FIELD:=Request.QueryString.Get('cd_field');
IMAGE_FIELD:=Request.QueryString.Get('image_field');
TABLE_NAME:=Request.QueryString.Get('table_name');
SQLConn:=SQLConnection.Create(GetConnectionString);
// a função acima pega a connectionstring (vc pode colocar a connectionstring diretamente aki)
SQLCmd:=SQLCommand.Create( 'select ' + IMAGE_FIELD +
' from ' +
TABLE_NAME +
' where ' +
CD_FIELD + ' = ' + CD_VALUE +
' and ' +
IMAGE_FIELD + ' IS NOT NULL' , SQLConn);
ImageFinder:=0;
SQLConn.Open;
SQLDtR:=SQLCmd.ExecuteReader;

While SQLDtR.Read do
Begin
Inc(ImageFinder);
FieldNum:=SQLDtR.GetOrdinal(IMAGE_FIELD);
BufSize:=SQLDtR.GetBytes(FieldNum, 0, Nil, 0, 0);
SetLength(Buf, BufSize);
SQLDtR.GetBytes(FieldNum, 0, Buf, 0, BufSize);
Response.Clear;
Response.BinaryWrite(Buf);
Response.&End;
End;
SQLConn.Close;
If ImageFinder = 0 then
Response.Redirect(Request.QueryString.Get('noimage'));
end;

Desta forma vc pode até fazer um catalogo de produtos, ou lista de fotos, pois cada imagem é uma requisição diferente... ;)
Outra coisa q vc pode notar no fonte é q nao possui indicação, no Response, do tipo de arquivo q o browser irá receber, isto era necessário ainda no tempo do mosaic, ou ie 3, e netscape 2, no entanto, hoje os browsers analisam o conteúdo antes de exibir, assim, o readimage.aspx q criamos nao serve apenas para imagens, mas para qq coisa q o browser suporte, nem q seja com plug-ins, se necessário...

Pronto, o dia seguinte foi bem produtivo ;) espero poder ter contribuido novamente com a comunidade...

[]'s Marcos André Costa

Publicidade

Vote no artigo




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes do artigo

Categoria: Outros
Adicionado dia: 31/08/06
Por: Marcos André Costa
Visualizado: 8355 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009