Carregar imagem no Flex após Upload utilizando campo BLOB com Hibernate [ RESOLVIDO ]

Olá Pessoal.

Tenho uma aplicação que faz o upload de uma imagem escolhida pelo usuário.No caso, eu defino que a imagem será salva em C:\imagens\nomedaimagem.jpg. Este caminho eu salvo também no banco de dados para recuperar a imagem depois.Porém, eu gostaria que logo após fazer o upload, a imagem já fosse carregada em um mx:Image. Mas tenho alguns problemas quanto à isso:

1º - Não consegui ainda fazer o flex carregar imagens externas, ou seja, só carrega uma imagem quando ela está dentro do projeto
2º - Se faço o upload da imagem para dentro do projeto, ela só poderá ser carregada na próxima vez que eu fizer o deploy da aplicação

Agluém tem uma idéia de como resolver isto? Ou então, de repente, se alguém já trabalhou com campo Blob e flex também já ajuda.

Valeu.

Fiz estas video aulas a um tempinho ja…
Parte 1

Parte 2

Espero que ajude !

Olá Rovides.
Com certeza ajudou sim cara.Obrigado.
Então…você menciona no vídeo sobre mostrar como carregar a imagem à partir do banco de dados.Você já tem algo que poderia mostrar?

Imagino o quanto foi difícil encontrar a solução, realmente o material sobre isso não é tão vasto…tem várias coisas que também penei pra encontrar.
Mas também estou disposto a compartilhar informações…qq coisa estamos aí.
valeu.

Não entendi se vc salva a imagem no computador do usuário. Se for assim, não vai ter como fazer em flex por razão de segurança do browser, que não te permite sair abrindo arquivo locais. Se vc estiver salvando no seu BD, bastaria salvar como Blob no campo e fazer uma chamada remota buscando a foto. Se for uma app Air, aí sim vc poderia acessar arquivos do comp do usuário, como o faz o Revelação Virtual.

[]s

Então, é flex mesmo, e não AIR.

Então, pensei em utilizar o cmapo blob mesmo, mas como carregar ele no Flex? Eu já uso o BlazeDS para fazer a integração com Java, mas como passaria a imagem do banco para o flex? você tem algum exemplo ou link?

Leia sebre a classe FileReference. Ela possui o método browse, através do qual o usuário escolhe a imagem a ser feito o upload e possui um método upload para fazer o upload para o servidor. Aí basta vc fazer a lógica de salvamento no mesmo. Depois basta vc chamar uma classe remota com ByteArray e mostar sua mensagem no cliente. Então leia sobre FileReference que vc vai achar a resposta.

[]s

Sim tenho sim !
O Codigo esta no trampo, da pra aguentar ate 4º feira?
hueiaueha

Mas pra adiantar … era algo assim

                            pngEnc: IImageEncoder;
	            var ohSnap:ImageSnapshot;
	            var v_ds_Anexo:String;
	            ohSnap = ImageSnapshot.captureImage(MinhaImagem, 0, pngEnc);
	            v_ds_Anexo = ImageSnapshot.encodeImageAsBase64(ohSnap);

Isto me retornaria uma Stringona , que seria minha imagem, eu salvo esta string no banco.
E para transforma-la em imagem novamente eu uso o base64Decoder funciona numa boa…

Esta foi a solução encontrada naquele momento…

Aguenta ate quarta que eu te mando o exemplo completinho…

vlww
(já morei em ourinhos eim !)

opa…maravilha, aguardo ae quando você puder postar, vai ser de grande ajuda.

Ah, tu morou aqui em Ourinhos…legal, onde?.Moro aqui a 5 anos…próximo ao Fórum.

falow.

Cara MIL DESCULPAS !!
NAO DEU MESMO para enviar antes…:stuck_out_tongue:

segue

[code]
private function getCaptureImg(p_Image:Image):String

{
pngEnc: IImageEncoder;
var ohSnap:ImageSnapshot;
var v_ds_Anexo:String;
ohSnap = ImageSnapshot.captureImage(p_Image, 0, pngEnc);
v_ds_Anexo = ImageSnapshot.encodeImageAsBase64(ohSnap); //MAGICA

return v_ds_Anexo;
}[/code]

Este metodo te retorna um Stringão, da imagem ja convertida (p_Imagem = minha imagem ja carregada)
no MEU caso estou salvando esta string no banco…
Para retorna-lo a consulta é feita normalmente… Depois pego esta Stringona de volta e trato ela

[code]
private function setConvertImagem(p_Image:Image, p_ImageStringDB:String):void
{
var base64Dec:Base64Decoder;
var byteArr:ByteArray;

base64Dec = new Base64Decoder();
base64Dec.decode(p_ImageStringDB); //p_ImageStringDB = resultado da consulta no campo imagem
byteArr = base64Dec.toByteArray();
p_Image.load(byteArr);

} [/code]

Foi uma saida…funciona numa boa MAS acontece que o sistema esta sendo migrado pra .NET(WinForm). Como estou em outro projeto o pessoal esta apanhando um pouco para arrumar um geito de ter as imagens de volta…mas…TA FUNCIONANDO !
Cara me lembro que na epoca foi a saida que encontramos…=/
Se souber outra posta ai.

Espero que isso ajude eu sei que é muito foda encontrar algo na net sobre isso.

FLWW

Ah, tranquilo cara…
Eu consegui aqui de uma outra maneira, vou postar aqui como ficou.Seguinte:

Na minha classe de persitencia ( Usuario ), tenho um trecho de código assim:

@Column(length = 50, nullable = false)
	private String nome;
	
	private byte[] binariosImagem;   
		  
	@Column(name = "FOTO", nullable = false,length=500)  
	public byte[] getBinariosImagem() {   
	    return this.binariosImagem;   
	}   
	  
	public void setBinariosImagem(byte[] binariosImagem) {   
	    this.binariosImagem = binariosImagem;   
	}

Onde o atributo binariosImagem, que armazenará a imagem, é do tipo byte.Após o hibernate criar as tabelas precisei modificar o tipo do campo binariosImagem para MEDIUMBLOB.

Na minha classe controlador, o método que faz a gravação ficou assim:


public void fazerUpload(byte[] bytes, String fileName) throws Exception 
	{       
		
				
		Usuario usuario = new Usuario();

		usuario.setCpf("545.454.454-4");
		usuario.setNome("nome de alguém");
		usuario.setBinariosImagem(bytes);
		usuarioDAO.gravar(usuario);
		
		}

Ainda na classe controlador, tenho um métod responsável por buscar um determinado usuário e devolver isto em um List para a tela mxml


public List carregar(String cpf) {
		List resultado = new ArrayList();
		Usuario u = usuarioDAO.buscarPorCPF(cpf);
		resultado.add(u);

		
		return resultado;
	}

Na minha tela, utilizo um RemoteObject para acessar os métodos do controlador.Nela, na parte de upload, fiz tudo o que é mostrado na vídeo aula postada pelo Rovides, e adicionei a linha que aciona o método do controlador que faz a gravação:


Controlador.fazerUpload(data, refUploadFile.name);

Possuo também na tela, um método resposável pelo carregamento dos dados de um usuário em um grid


public function carregar():void
		{
			var cpf:String;
                                                cpf = txtcpf.text;
			Controlador.carregar(cpf);
		}	
		
		public function carregarOk(event:ResultEvent):void
		{
			listagem = event.result as ArrayCollection;
			
		}
		public function carregarErro(event:FaultEvent):void
		{
			Alert.show("erro" + event.fault);
		}

Neste caso, a variável listagem é um ArrayCollection [Bindable] , tenho um DataGrid que aponta para esta variável.


<mx:DataGrid x="40" y="37" width="160" dataProvider="{listagem}" id="grid">
		<mx:columns>
			<mx:DataGridColumn headerText="Column 1" dataField="nome"/>
			<mx:DataGridColumn headerText="Column 2" dataField="binariosImagem"/>
			
		</mx:columns>
	</mx:DataGrid>

E por último ( ufa! ), tenho um componente Image que “aponta” para a linha selecionada do DataGrid.


<mx:Image x="430" y="177" autoLoad="true" id="_img" source="{grid.selectedItem.binariosImagem}"/>

Bom pessoal, é isto, esta foi a solução que encontrei e compartilho-a com vocês.Espero que isso ajude mais alguém.E agradeço aí ao Rovides e ao renzonuccitelli pela colaboração.Valeu!!! :wink:

MUIITO BOM !
valew

[quote=Rovides]Cara MIL DESCULPAS !!
NAO DEU MESMO para enviar antes…:stuck_out_tongue:

segue

[code]
private function getCaptureImg(p_Image:Image):String

{
pngEnc: IImageEncoder;
var ohSnap:ImageSnapshot;
var v_ds_Anexo:String;
ohSnap = ImageSnapshot.captureImage(p_Image, 0, pngEnc);
v_ds_Anexo = ImageSnapshot.encodeImageAsBase64(ohSnap); //MAGICA

return v_ds_Anexo;
}[/code]

Este metodo te retorna um Stringão, da imagem ja convertida (p_Imagem = minha imagem ja carregada)
no MEU caso estou salvando esta string no banco…
Para retorna-lo a consulta é feita normalmente… Depois pego esta Stringona de volta e trato ela

[code]
private function setConvertImagem(p_Image:Image, p_ImageStringDB:String):void
{
var base64Dec:Base64Decoder;
var byteArr:ByteArray;

base64Dec = new Base64Decoder();
base64Dec.decode(p_ImageStringDB); //p_ImageStringDB = resultado da consulta no campo imagem
byteArr = base64Dec.toByteArray();
p_Image.load(byteArr);

} [/code]

Foi uma saida…funciona numa boa MAS acontece que o sistema esta sendo migrado pra .NET(WinForm). Como estou em outro projeto o pessoal esta apanhando um pouco para arrumar um geito de ter as imagens de volta…mas…TA FUNCIONANDO !
Cara me lembro que na epoca foi a saida que encontramos…=/
Se souber outra posta ai.

Espero que isso ajude eu sei que é muito foda encontrar algo na net sobre isso.

FLWW

[/quote]

Cara tem como dar um @embede na imagem que está no byteArray?
pq tenho uma aplicação que imprime uma imagem recuperada por esse método, só que na visualização da impressão ela não aparece, mas na impressão propriamente dita ela está lá.
Me ajuda aí.
Desde já Agradeço.

Cara, nao vejo nenhuma forma de fazer com o @Embed("…") a no ser que voce escreva o arquivo fisico em uma pasta sugestiva, e coloque no @Embed o caminho da imagem que foi gerada.

MAS NAO RECOMENDO USAR ASSIM (na verdade nem sei se fununcia, rs)

Até

[quote=Daniel T.S][quote=Rovides]Cara MIL DESCULPAS !!
NAO DEU MESMO para enviar antes…:stuck_out_tongue:

segue

[code]
private function getCaptureImg(p_Image:Image):String

{
pngEnc: IImageEncoder;
var ohSnap:ImageSnapshot;
var v_ds_Anexo:String;
ohSnap = ImageSnapshot.captureImage(p_Image, 0, pngEnc);
v_ds_Anexo = ImageSnapshot.encodeImageAsBase64(ohSnap); //MAGICA

return v_ds_Anexo;
}[/code]

Este metodo te retorna um Stringão, da imagem ja convertida (p_Imagem = minha imagem ja carregada)
no MEU caso estou salvando esta string no banco…
Para retorna-lo a consulta é feita normalmente… Depois pego esta Stringona de volta e trato ela

[code]
private function setConvertImagem(p_Image:Image, p_ImageStringDB:String):void
{
var base64Dec:Base64Decoder;
var byteArr:ByteArray;

base64Dec = new Base64Decoder();
base64Dec.decode(p_ImageStringDB); //p_ImageStringDB = resultado da consulta no campo imagem
byteArr = base64Dec.toByteArray();
p_Image.load(byteArr);

} [/code]

Foi uma saida…funciona numa boa MAS acontece que o sistema esta sendo migrado pra .NET(WinForm). Como estou em outro projeto o pessoal esta apanhando um pouco para arrumar um geito de ter as imagens de volta…mas…TA FUNCIONANDO !
Cara me lembro que na epoca foi a saida que encontramos…=/
Se souber outra posta ai.

Espero que isso ajude eu sei que é muito foda encontrar algo na net sobre isso.

FLWW

[/quote]

Cara tem como dar um @embede na imagem que está no byteArray?
pq tenho uma aplicação que imprime uma imagem recuperada por esse método, só que na visualização da impressão ela não aparece, mas na impressão propriamente dita ela está lá.
Me ajuda aí.
Desde já Agradeço. [/quote]

Alguém aí sabe resolver esse problema?
Agradeço Muito.

Trata-se de um relatório?

[quote=Rovides]Trata-se de um relatório?
[/quote]

Isso mesmo um relatório no flex Report

[quote=Rovides]Trata-se de um relatório?
[/quote]

Exatamente,
Um relatório no flex Report só que essa imagem nçao sai

Rodives me passa Teu msn

fael_assa@hotmail.com

velho, esse flex report nem é legal nao… tentei usa-lo tbm, mas quando chegou na parte das imagens…FERROU!
kkkk
usa o IReport!

Mais é que com o IReport é complicado demais.
Olha só, é um sistema de notas fiscais.
Quando o cara terminar de cadastrar a nota ele imprime,
essa nota tá numa tabela no banco de dados junto com todas as outras então eu preciso imprimir só uma específica.
Como fazer isso no IReport?
Eu sei que tem haver com parâmetros mas não consegui fazer.