O NeoMatrix Tech está de casa nova!

Você deverá ser redirecionado em 6 segundos. Se não, visite:
http://www.leonelfraga.com/neomatrixtech
e atualize seus favoritos.

Aviso IMPORTANTÍSSIMO!

Aviso aos navegantes:

O NeoMatrix Tech mudou de casa!!!

A partir de agora, acessem pelo novo endereço:

http://www.leonelfraga.com/neomatrixtech

Ué... mas é só o domínio mudou de lugar?

R: Na verdade, não é bem assim hehe. Este domínio que você acessa agora aponta para um blog hospedado no Blogger, enquanto no novo, aponta para um blog na plataforma Wordpress, hospedagem própria, muito mais rápida e com um layout mais agradável de ler ;)

Não vou fechar este domínio igual ao que eu fiz com o NM Light (que já está 100% na nova plataforma). Talvez beeeeeeem depois eu faça isso.

Todos os posts daqui se encontram lá, e novos posts serão colocados somente no novo endereço.
A única coisa que não consegui importar foram os comentários. Mas em breve vai ter um post contando sobre a epopéia que foi migrar o NeoMatrix Tech!

Somente vou fechar a área de comentários daqui. Caso queiram comentar, favor ver o post correspondente no "Novo NeoMatrix Tech" e comentem por lá. É bem melhor! (pena que os permalinks "amigáveis para SEO" não funcionam lá, dá erro 404 e não consigo fazer a configuração funcionar. E olha que eu já vi vários artigos falando desse assunto :( ).

Quem assina o feed, já está lendo o conteúdo do novo NeoMatrix Tech!

domingo, 30 de novembro de 2008

O barato pode sair MUITO caro...

Vocês já estão acostumados a ouvir o ditado acima. Com certeza já ouviu isso várias vezes. Eu também.

Nesse mundo da Informática, mais especialmente com hardware, devemos tomar muito cuidado na hora de escolhermos os componentes que farão parte de nosso PC. Guardadas as devidas proporções, para qualquer geek um PC equivale a um filho, e ele merece o máximo de cuidado desde a sua concepção.

Comprar a placa mãe top de linha, um processador bom, memórias de marca, placa de vídeo top também. Tudo meticulosamente bem calculado para o máximo de desempenho.
Neste novo PC que montei, fiz questão de que cada parte não fosse "xing-ling", genérica. Isso incluindo teclado e mouse.

E o povo compra uma fonte genérica ou uma "genérica de luxo"...

Antes não dávamos muita importância para a fonte de alimentação do nosso PC, só olhávamos a potência rotulada. De uns tempos para cá, olhando no site Clube do Hardware, vi a importância que se tem de dimensionar bem a fonte de alimentação do PC, assim como vi testes que revelam inúmeras bombas (no sentido literal da palavra mesmo).

Fatores como forma de construção, PFC (Power Factor Correction - Correção do Fator de Potência) ativo, forma como a ventilação é feita, e principalmente qual a potência REAL que ela pode fornecer.

Uma fonte genérica alimentando um PC parrudo é pedir para ele ser queimado. Como ela não poderá segurar o consumo de um PC parrudo, poderá explodir e ainda por cima levar alguns componentes junto. O ideal é superdimensionar um pouco, para ela trabalhar com folga e permitir upgrades "nervosos" :-)

Vejamos esse novo PC, com placa-mãe GA-X48-DQ6 que é um pouco fominha quando está bombando (e ela tem recursos de economia de energia que funcionam muito bem, por sinal), processador Core 2 Duo E8400 de 3,0 GHz (que também tem recurso de economia de energia), uma Radeon HD 4870. Isso sem contar HD, drive de CD, cooler do gabinete...

A máquina custou pouco mais que 3000 reais, comprando as peças na Santa Ifigênia tudo com nota fiscal, tudo certinho. Todo esse poder é segurado por uma fonte da Cooler Master de 500W Reais, e sua eficiência ultrapassa os 80%, ou seja, aproveita bem o fornecimento da rede elétrica. Essa não é uma fonte "top", como Zallman, Thermaltake, Corsair ou Enermax, mas ela aguenta muito bem essa configuração.

Vejam o screenshot que mostra os valores de tensão, medidos pelo Everest:

Screenshot Voltagens da Placa-Mãe

As tensões estão em seus valores nominais. E olha o consumo de corrente da GPU (Radeon HD 4870): quase 30 ampéres, com uma tensão de 12V, ou seja, se fizermos as contas, 360W no pico, ou seja, bombando. Um chuveiro de 5400W, ligado na rede de 220V consome 24,5 A. Muita coisa, não é?

Se fornecemos uma alimentação incorreta para ela, ou seja, a fonte não aguentar o tranco, corre o risco do PC nem ligar.

Se fosse uma fonte vagaba, esses valores de tensões estariam abaixo desses valores, e com isso, o PC fica instável. Quer um exemplo?

Meu Celeron 2,5 era equipado com uma fonte genérica, a que veio no gabinete. A linha de 12V ficava em torno de 11, as outras linhas de tensão também ficavam abaixo dos valores. E olha que esse PC não tem fome por energia. Com isso, o PC travava, ressetava várias vezes.

Fora esses problemas, o cooler da fonte também ficava travando, fazendo um barulho muito forte. Quando acontecia isso, o jeito era desmontar a fonte, limpar, lubrificar o cooler e colocá-lo de volta no lugar. Isto teria que ser feito com frequência (é, o trema tá indo pro saco mesmo hehe).

Até que resolvi comprar uma Seventeam 420 BKV. Todos os problemas acabaram. Ela NUNCA precisou de manutenção no cooler (só uma limpeza para tirar o excesso de poeira), as tensões sempre ficaram em seus valores corretos, mesmo quando bem solicitada, e ela já tem mais de 1 ano de atividade.

Ou seja, um investimento que dura até hoje.

O caro que sai bem barato, um investimento que se pagou. Se eu comprasse uma genérica, acaba a garantia, dá pau, depois outra, outra... o barato vai saindo caro. Isso se, a fonte não estragar o PC. Aí fora a fonte, teremos que comprar placa mãe, processador... depende do que ir pro saco :P

E não é só fonte que causa problema também... um estabilizador subdimensionado também causa dor de cabeça. Vou citar um exemplo que aconteceu comigo: Quando montei o PC, comprei um estabilizador SMS de 300VA. Liguei o micro nele, tudo funciona normal, perfeito. Eis que jogo um game um pouco mais pesado, um NFSU 2 e com alguns minutos de jogo o PC desliga.

Mas desliga TUDO, inclusive o monitor apaga, as caixas de som também desligam. Pensei: CARALHO, DEU PAU AQUI. E não foi só uma vez... eis que desligo o estabilizador, ligo de novo, entro no jogo, alguns minutos e a mesma coisa. Aí parei para pensar um pouco e surgiu uma luz: "porra, se é o estabilizador que tá caíndo, ele não deve estar aguentando o tranco". Tive a idéia de deixar só o monitor e as caixas de som nele, e ligar o PC diretamente no filtro de linha. Aí nunca mais tive problemas.

E o risco que eu corria de alguma corrupção de dados, algum surto de energia provocado pela queda repentina queimasse algo do PC...

Mudando o papo de pato pra ganso... Com periféricos xing-ling também poderemos ter dores de cabeça, sem nem mesmo falar da qualidade. Uma epopéia para achar os drivers do dispositivo, caso vc perca o CD de instalação.

No outro PC tenho um teclado multimídia. O programa de instalação dele está em chinês, não dá para entender porra nenhuma. Hoje esse programa não está mais instalado, sorte que o Windows XP reconheceu as teclas de atalho (exceto o scroll, botões de copy/paste, etc) e trabalho com ele normal.

Comprar de uma marca confiável, como Logitech e Microsoft é mais negócio.

É isso ae! Quando forem investir em um PC, procurem fazer um ótimo negócio comprando tudo "de marca" boa!

E aguardem as dicas de C#, já tenho alguns assuntos aqui :-)

Abraço a todos!

Leia o restante deste post...

quarta-feira, 19 de novembro de 2008

Criando uma Máquina Virtual com VMWare e Instalando o MS-DOS + Windows 3.11 (Nostalgia!)

E aí galerinha, tudo em cima?

Que tal aproveitar bem esse feriado (pelo menos aqui em São Paulo e em algumas cidades do Brasil) do Dia da Consciência Negra para aprender como montar uma máquina virtual utilizando um dos melhores programas desse segmento, o VMWare Workstation?
Este artigo será 100% videoaula, sem post escrito após os vídeos, como de costume aqui no NM Tech. Os vídeos são explicados de maneira fácil, bem didática, para que você não perca nenhum detalhe de como fazer o setup básico de uma máquina virtual e instalar nela um sistema operacional.
O S.O. que iremos instalar vai fazer os "dinossauros" da computação (como eu)  relembrar algumas coisas. Instalaremos aqui o MS DOS e o Windows 3.11, pois eles são muito rápidos para instalar em uma máquina atual de maneira que nos vídeos vamos fazer a coisa completa: Criar a VM, Instalar o S.O. e brincar um pouco :-) Mas os procedimentos mostrados servem para instalar QUALQUER S.O., bastando para isso seguir os procedimentos normais do mesmo.

O programa virtualizador que utilizarei aqui é o VMWare Workstation versão 6.0, mas os procedimentos mostrados no tutorial se aplicam também para o VMWare Server 1.x, um programa gratuíto da mesma empresa.

Ah, e já adiantando a pergunta: Onde consigo as imagens do MS DOS e do Windows 3.11?

Se vocês tiverem os disquetes de instalação (sim, tem gente que ainda tem!!!), podem criar a imagem utilizando uma feature do próprio VMWare Workstation (no vídeo mostra onde) ou então utilizando o programa Rawrite. Ou até mesmo usar o próprio disquete :P
Ah, mas você quer saber onde baixar na net? Então dá uma olhada nesse post do Plínio Torres, que explica como usar no Virtual Box (a idéia de usar o Windows 3.11 veio de lá, enquanto que a fonte inspiração para montar este tutorial foi uma amiga minha ;-) ).

O tempo total dessa videoaula é de 50 minutos, aproximadamente. E como o limite do Youtube é de 10 minutos, necessitei dividir o vídeo. A videoaula está dividida em duas partes: 1. Fazendo o Setup Inicial de uma Máquina Virtual e 2. Instalando o Sistema Operacional. Ao todo são sete vídeos, três da primeira parte (20 minutos) e quatro da segunda (31 minutos).
A primeira parte de cada vídeo será mostrada no player embeded aqui no NM Tech, e abaixo os links para as próximas partes.

Boa aula! ;-)

1. Criando uma Máquina Virtual com o VMWare Workstation 6.0

 

2. Instalando um Sistema Operacional na Máquina Virtual (MS DOS + Windows 3.11)

Leia o restante deste post...

quarta-feira, 12 de novembro de 2008

Mega Pack com 15000 ícones!

Olá galera!
Como desenvolvedores, podemos chegar em um ponto que devemos pensar no design da nossa aplicação, seja ela web ou desktop.
E para deixar ela mais bonita, nada melhor do que colocar alguns ícones representando algumas ações, e o ditado que diz "uma imagem vale mais do que mil palavras" se aplica bem aqui.

No site Meiobit, o Dori Prata escreveu um post perguntando se colecionávamos ícones. E nesse post comentou sobre sua coleção de 15000 ícones; e todos queriam que ele a disponibilizasse!

Então, em um outro post, essa coleção foi colocada no ar, para que todos pudéssemos aproveitar.

Segue o link com o post, acessem, leiam e baixem a coleção!

http://meiobit.pop.com.br/meio-bit/miscelaneas/minha-colecao-de-icones-para-download

[Via MeioBit]

[]'s a todos!

Leia o restante deste post...

sábado, 8 de novembro de 2008

Confirmando Leitura de E-mail com ASP.NET

Olá pessoal! E aí, tudo belezinha?

Este artigo, mais com cara de dica, vai tratar de como pegar uma confirmação de leitura de um e-mail enviado por um sistema, porém sem adicionar na mensagem uma solcitação de confirmação de leitura pelo cliente de e-mail do usuário.

Há N formas de fazer isso, vou citar duas delas, porém como vocês verão irão executar os mesmos procedimentos: Link de confirmação e iframe oculto na mensagem.

Porém já quero alertar que ambas as formas têm seus senões: A mensagem poderá ser interpretada pelo provedor (ou cliente de e-mail do usuário) como spam e o mesmo poderá bloquear a execução dos scripts que estarão sendo propostos aqui.

O artigo requer que você já tenha um conhecimento prévio de como enviar e-mail utilizando o .NET Framework (basicamente as classes MailMessage e SMTPMail), portanto, não irei destacar o uso delas.

Como este artigo é mais uma dica e o foco é na lógica do processo, dessa vez não teremos um código funcional de exemplo em nossa página de suporte :-(

Solução 1: Link na página

A solução mais simples é a de colocar um link na página, em que o usuário irá clicar e ao abrir a página no navegador irá ser gravado algum tipo de registro indicando que o usuário leu a mensagem.

Para isso, em primeiro lugar você deverá criar uma página em seu site com alguma mensagem para o usuário. O importante será o seu evento Page_Load. Mas, para a coisa funcionar, você precisará saber qual usuário está abrindo a mensagem, não é?

Supondo que você já tenha uma mailing-list, você deverá passar na querystring desta página alguma coisa para identificar o usuário, e deverá montar um link e colocá-lo no corpo da mensagem.

Como exemplo, vamos compor uma mensagem simples, através de uma classe que retorna uma lista de pessoas e envia uma mensagem padronizada para o usuário.

   1: public void EnviaMailList(List<Usuarios> usuarios)
   2: {
   3:     string pMensagem = "Teste de mensagem padrão, clique no link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0} para confirmar";
   4:     foreach(Usuario u in Usuarios)
   5:     {
   6:         EnviarMensagem(String.Format(pMensagem,u.UsuarioID),u);
   7:     }
   8: }

O exemplo acima varre uma lista qualquer com um mailing qualquer, e temos a variável pMensagem com um link para um arquivo chamado Mensagem.aspx, que irá receber em sua querystring dois parâmetros, sendo o primeiro a mensagem que queremos controlar e o segundo o usuário que irá lê-la.

O String.Format do primeiro parâmetro (a mensagem a ser enviada) do método EnviarMensagem do nosso código irá colocar o ID do usuário no link que o usuário deverá clicar (esse é o problema... dependemos de uma ação do usuário para saber se ele leu a mensagem).

Agora veremos o que deve ser colocado no evento Page_Load da página Mensagem.aspx:

   1: protected void Page_Load(object sender, EventArgs e)
   2: {
   3:     if( (Request.Params["m"] != null) && (Request.Params["u"] != null))
   4:     {
   5:         Newsletter n = new NewsLetter();
   6:         n.ConfirmarLeitura(Request.Params["m"].ToString(),Request.Params["u"].ToString());
   7:     }
   8: }

Outra coisa simples! Primeiramente checamos se há os parâmetros na querystring, e se tiver, disparamos o processo que poderá gravar um registro em uma tabela em BD, por exemplo, indicando qual usuário leu aquela mensagem.

Mas lembre-se do senão: O usuário DEVERÁ clicar no link, além dos outros probleminhas já comentados acima (provedor ou cliente de e-mail achar que é spam, bloquear links, etc).

E não há uma forma "anônima", que não dependa tanto da ação do usuário para eu saber que ele leu a mensagem? Resposta: Há sim, utilizando iFrames (olha ele aí de novo!) na mensagem!

Solução 2: IFrames na mensagem

Para a coisa ficar mais anônima, iremos utilizar a mesma página Mensagem.aspx citada anteriormente, porém dessa vez ela deverá estar em branco. Para isso funcionar, a mensagem DEVERÁ estar em formato HTML, e o senão dessa vez é que o servidor de e-mail ou o cliente de e-mail poderá interpretar isso como uma página maliciosa, além dos outros já citados.
Neste código HTML, devemos colocar um iFrame cujo fonte seja a própria Mensagem.aspx, como segue o exemplo:

   1: public void EnviaMailList(List<Usuarios> usuarios)
   2: {
   3:     string pMensagem = " bla bla bla bla bla...";
   4:     pMensagem +- "<iframe src='link http://www.meusite.com.br/Mensagem.aspx?m=1&u={0}' style='width:0px;height:0px;visibility:hidden; border:0px' />"
   5:     foreach(Usuario u in Usuarios)
   6:     {
   7:         EnviarMensagem(String.Format(pMensagem,u.UsuarioID));
   8:     }
   9: }

Como podemos ver, temos no código HTML da mensagem um iFrame cujo atributo src é a página Mensagem.aspx e ele é invisível para o usuário. Quando a página for aberta no cliente de e-mail, o iframe também será aberto e o evento Page_Load de Mensagem.aspx é executado.
Outra dica, é definir a mensagem principal na própria página Mensagem.aspx, ou seja, a mensagem na verdade irá vir de um ambiente externo (seu servidor web), e enviando somente o iframe e algumas instruções de "caso não consiga visualizar esta mensagem clique aqui..." para o usuário.

A não ser pelos senões, creio que estas soluções são bem simples e funcionais :-)

Um abraço!

Leia o restante deste post...

sábado, 1 de novembro de 2008

Upload em ASP.NET com jqModal e Efeitos Ajax Pt. 3 -> Exibindo e fazendo download da foto do BD

Olá pessoal! Chegamos ao último artigo da série que ensina como fazer um upload de arquivo quando utilizamos o UpdatePanel do ASP.NET e janelas modais, porém sem perder a navegação no estilo AJAX (como é do nosso conhecimento, o FileUpload do ASP.NET necessita de um postback para ser executado).

Na primeira parte, foi explicado como fazemos um upload de um arquivo em janelas modais e UpdatePanel, utilizando iframes para manter a navegação no estilo AJAX e salvar o resultado do upload no sistema de arquivos do servidor; na segunda parte, como salvar esse arquivo em um banco de dados utilizando a Classe de Conexão e diretamente pelo provider do banco de dados (o Firebird é usado como exemplo).

Nesta terceira e última parte do tutorial, vou detalhar como exibimos em uma página e disponibilizamos para download esta foto que recuperamos do banco de dados.

Por incrível que pareça, esta é a parte mais simples de todas. Como todas as outras partes, assistam a vídeo-aula (screencast) e vejam a explicação em texto abaixo.

E os arquivos utilizados, podem ser obtidos na nossa página de suporte no final do artigo (cliquem no link para fazer o download)!


No artigo anterior, vimos que através de um comando SELECT trazemos para o nosso objeto TCadastro***** o campo BLOB que corresponde ao nosso arquivo, e que na classe ele é apenas um array de bytes sem distinção de formato, essas coisas. Isso na biblioteca de classes.

Na página Default.aspx do nosso exemplo, especialmente na janela modal dvEditarFoto temos um label que irá receber um comando HTML com a seguinte estrutura: <img src="visImagem.aspx?fid=xxx" ... /> e que no atributo src temos uma página .aspx que recebe em sua querystring o código da foto que iremos editar.

No exemplo deste artigo, temos algumas pequenas mudanças no design da página Default.aspx: No gridiview temos um botão que faz o download da foto, e em seu evento OnClick temos o registro da função JavaScript em Consts.Javascript.openWindow, que nada mais é que a montagem de um comando window.open, com a ajuda do registro da constante Consts.Javascript.ScriptPopUp no evento Page_Load. Ele abre a mesma página visImagem.aspx, porém recebendo outro parâmetro em sua querystring (d=1), além do ID da foto.

Também foi colocado uma tag <img> no gridview, que tem no seu atributo src a mesma página visImagem.aspx recebendo em sua querystring o ID da foto. Uma coisa interessante é a forma como eu monto essa tag <img> dentro da TemplateColumn do gridview:

Default.aspx.cs (Parcial)
   1: <asp:TemplateField>
   2:     <ItemTemplate>
   3:         <asp:Button runat="server" ID="btnEditar" Text="Editar" CommandArgument='<%#Bind("FotoID")%>' OnClick="btnEditar_Click" />
   4:         <asp:Button runat="server" ID="btnDownload" Text="Download" CommandArgument='<%#Bind("FotoID")%>' OnClick="btnDownload_Click" />
   5:         <asp:Button runat="server" ID="btnExcluir" Text="Excluir" CommandArgument='<%#Bind("FotoID")%>' OnClick="btnExcluir_Click" OnClientClick="return confirm('Deseja excluir?');"/>
   6:         <img runat="server" id="foto" src='<%#Bind("FotoID","visImagem.aspx?fid={0}")%>' alt="foto" width="50" height="50" />
   7:     </ItemTemplate>
   8: </asp:TemplateField>

Esta tag <img> possui o atributo runat="server", pois para alimentar a propriedade (sim, agora chamo assim exatamente por causa do runat="server" :-) ) utilizo-me da diretiva #Bind (que necessita que o controle onde vamos usar essa diretiva tenha o atributo runat="server" e consequentemente um ID), que no primeiro parâmetro recebe o nome do campo (ou propriedade da classe) que queremos que seja impresso na página e no segundo parâmetro uma string de formatação, que no nosso caso é "visImagem.aspx?fid={0}", onde "{0}" será substituído pelo ID da foto (por exemplo, você poderia usar aí qualquer string de formatação do .NET, como datas, moeda, etc, utilizando para isso "{0:<string de formatação do .NET>}", ex: "{0:dd/MM/yyyy}" para formatar uma data.

Como vocês já devem ter notado e se perguntado... o lance é a página visImagem.aspx, não é? Resposta: Sim, a própria!

Em ambos os casos (tanto visualizando a foto na página Default.aspx através do modal dvEditarFoto quanto na opção para download a página visImagem.aspx É o próprio arquivo de imagem que queremos recuperar. Mas como isso é feito, já que uma página .aspx é interpretada pelo compilador asp.net como uma página HTML?

Vou mostrar aqui apenas o code-behind da página visImagem.aspx, já que o design não possui componentes (possui somente as declarações do asp.net, tags head, html e body e a tag form). Isso mesmo, é só criar a página pelo Visual Studio e ir direto no code-behind :-)

visImagem.aspx.cs
   1: using System;
   2: using System.Data;
   3: using System.Configuration;
   4: using System.Collections;
   5: using System.Web;
   6: using System.Web.Security;
   7: using System.Web.UI;
   8: using System.Web.UI.WebControls;
   9: using System.Web.UI.WebControls.WebParts;
  10: using System.Web.UI.HtmlControls;
  11: using System.IO;
  12: using AppCore;
  13:  
  14: namespace UploadAJAX
  15: {
  16:     public partial class visImagem : System.Web.UI.Page
  17:     {
  18:         protected void Page_Load(object sender, EventArgs e)
  19:         {
  20:             if (Request.Params["fid"] != null)
  21:             {
  22:                 Response.Buffer = true;
  23:                 Response.ContentType = "image/jpeg";
  24:                 TCadastroClsConn cad = new TCadastroClsConn();
  25:                 try
  26:                 {
  27:                     cad.FotoID = Int32.Parse(Request.Params["fid"].ToString());
  28:                     if (cad.Foto.Length != 0)
  29:                     {
  30:                         string att = "inline";
  31:                         if (Request.Params["d"] != null)
  32:                         {
  33:                             att = "attachment";
  34:                         }
  35:                         
  36:                         Response.AddHeader("Content-Disposition", att + "; filename=foto" + cad.FotoID.ToString() + ".jpg");
  37:                         BinaryWriter bw = new BinaryWriter(Response.OutputStream);
  38:                         bw.Write(cad.Foto);
  39:                         bw.Flush();
  40:                         bw.Close();
  41:                     }
  42:                 }
  43:                 finally
  44:                 {
  45:                     cad.Dispose();
  46:                 }
  47:                 Response.End();
  48:             }
  49:         }
  50:     }
  51: }

A "transformação" de um arquivo .aspx em um arquivo qualquer (sim, este procedimento serve para recuperarmos QUALQUER tipo de arquivo) consiste em alterar o tipo de conteúdo no cabeçalho da resposta HTTP e colocarmos o arquivo desejado no stream de saída (o que vai para o navegador) da página.

No evento Page_Load, checamos se o parâmetro "fid" (que é informado na querystring) existe.

Setamos a propriedade Response.Buffer para true, isto indica que o que estiver no buffer de saída será enviado após processarmos a resposta (no nosso caso, com o método Response.End no final do evento Page_Load).

Como estamos trabalhando com imagens, e qualquer navegador hoje em dia trabalha com arquivos .jpg nativamente, colocamos no MIME type de resposta o valor "image/jpeg", que corresponde ao MIME type para arquivos .jpg. Isto é feito através da propriedade Response.ContentType.

Um parêntese aqui: E se o arquivo for um gif ou PNG? Neste caso, no banco de dados teríamos que gravar a extensão do arquivo que fizemos upload e precisaríamos de uma tabela auxiliar de MIME types, para setarmos a resposta corretamente. Mas como isso foge do escopo da série de artigos, deixo para você pensar um pouco :-)

Em seguida, instanciamos a classe TCadastroClsConn (poderia ser a sem a Classe de Conexão também), setando na propriedade FotoID o parâmetro "fid". Se o conteúdo da propriedade Foto (um array de bytes) for diferente de zero, vamos para o pulo do gato:

Criei uma variável chamada "att" do tipo string com o valor "inline". Se a querystring tiver um parâmetro chamado "d" ("d" de "Download"), não importando o valor, mudo essa variável para "attachment".

Explico: Logo na linha abaixo, inserimos no cabeçalho da resposta HTTP, através do método Response.AddHeader a chave "Content-Disposition", que indica como o navegador irá disponibilizar para o usuário o conteúdo que está sendo enviado pelo servidor web. Como valores possíveis, temos:

- inline: o conteúdo será disponibilizado através da área de visualização do navegador.
- attachment: o conteúdo será direcionado para o gerenciador de downloads do navegador.

Se o parâmetro "d" não existir na querystring, iremos enviar "inline", caso contrário, "attachment".

Como complemento do valor da chave "Content-Disposition", informo o atribiuto "filename", que será o nome do arquivo que irá aparecer no gerenciador de downloads do navegador quando baixamos esse arquivo.

Caso a opção seja por visualizar no navegador, ele irá renderizar o conteúdo que enviamos no stream de saída como um arquivo jpg (como informamos anteriormente no Response.ContentType), porém, quando vemos as propriedades desta imagem, vemos a URL que colocamos na tag <img> em Default.aspx, que é a própria página visImagem.aspx, como na imagem abaixo

screenshot-propfoto-firefox

Setamos como vai ser o tipo e a disposição do conteúdo de saída da página, agora só falta setar o conteúdo em si :-)

O que será enviado para o navegador do usuário está na propriedade Response.OutputStream do objeto Page (a própria página hehe). Ele é do tipo Stream.

Iremos colocar no OutputStream a foto que iremos enviar para o usuário, e ela é um array de bytes em que cada posição está cada byte do arquivo de foto. Para colocar este array de bytes no OutputStream, vamos fazer uso da classe BinaryWriter, que está no namespace System.IO, criando um objeto chamado "bw".

Ao instanciar a classe BinaryWriter no objeto bw, colocamos em seu construtor o stream de destino, que no nosso caso é o próprio Response.OutputStream. Em seguida, chamamos o método Write() do BinaryWriter que em uma das sobrecargas recebe como parâmetro um array de bytes (justo o tipo que estamos trabalhando :-) ); informamos neste parâmetro a propriedade Foto do nosso Cadastro (que por sua vez, irá buscar a foto que está em FotoID no banco de dados, através do método getRawFile, lembra?), para em seguida chamar o método Flush() e fecharmos o BinaryWriter.

Por fim, chamamos o método Response.End() que irá enfim enviar a foto para o usuário.

Este método serve para obtermos QUALQUER tipo de arquivo que gravamos em um banco de dados E não salvamos em hipótese alguma na estrutura de diretórios do servidor web. Pode ser foto, mp3, pdf, enfim, qualquer um, bastando informar o MIME type correto no Response.ContentType, e tomar cuidado ao usar os meios "inline" e "attachment" dependendo do tipo de arquivo, por exemplo, para .exe usar o meio "attachment".

Fácil, não foi?

Um abraço a todos, e até o próximo artigo (quem sabe... não vamos aprender a gerar um thumbnail através da imagem que gravamos no BD?)!

Upload com efeito AJAX usando jQuery Pt. 3 (221 KiB)

Leia o restante deste post...

Sobre o NeoMatrix Tech

Meu blog para assuntos profissionais, ligado com tecnologia.
Dicas de programação (grande parte de C# e ASP.NET, mas não limitado a essa plataforma :-) ), dicas de utilitários, análises de equipamentos e serviços, resenhas sobre sites que eu visito, relacionados com tecnologia, opinião sobre mercado de trabalho, metodologias de desenvolvimento, comportamento no mundo tecnológico...

NeoMatrix Light

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO