Soluções com imagens

9 respostas
claudneto

Galera,

To fazendo um projetinho simples, mas estou com um problema.

É um cadastro de notebooks pra uma loja. Porém, não sei como armazenar imagens. Me disseram que jogar em um campo varchar do banco apenas o link da imagem seriam mais fácil, pois não deixaria o BD mto pesado.

Tudo bem, até jogar o link pro BD eu sei, mas eu não sei como fazer o upload da foto para o servidor de forma automatizada. Apenas clicando no botão Confirma no cadastro ele fazer o upload do arquivo pro servidor.

Uma outra coisa mais simples é fazer ou adicionar um componente que eu não conheço que selecione um arquivo do computador. No NetBeans eu sei que tem um componente desse, mas em Flex eu não sei.

9 Respostas

G

Olá ClaudNeto.No caso do Flex, o melhor é gravar a imagem no banco mesmo.Pelo que percebi até agora, o Flex não carrega imagens “externas”.E se vc colocar a imagem dentro do projeto, ela só será carregada no próximo deploy da aplicação.

Faça assim:

1º - para a parte de upload, utilize estes vídeos aqui

Parte 1

Parte 2

2º - crie um tutorialzinho meio safado aqui…rs… siga mais ou menos estes passos aqui:

seu objeto de persistência deve ficar assim ( usando hibernate )

package persistencia;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;

@SuppressWarnings("serial")
@Entity
public class Usuario implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long codigo;

	@Column(length = 14, nullable = false)
	private String cpf;

	@Column(length = 50, nullable = false)
	private String nome;
	

// REPAREM QUE O CAMPO QUE ARMAZENARÁ A FOTO FOI  //DEFINIDO COMO byte
	private byte[] binariosImagem;   
		  
	@Column(name = "FOTO", nullable = false,length=500)  
	public byte[] getBinariosImagem() {   
	    return this.binariosImagem;   
	}   
	  
	public void setBinariosImagem(byte[] binariosImagem) {   
	    this.binariosImagem = binariosImagem;   
	}

	
	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	
}

No arquivo hibernate.cfg.xml , defina:

<property name="hbm2ddl.auto">create</property>

Após a ?recriação? da tabela, você verá que existirá um campo chamado ?foto?, e o tipo dele será Blob.vizualize a estrutura da tabela e altere o tipo deste campo para MediumBlob.

No seu controlador, você deve ter um método fazerUpload.Ele que contém os bytes referentes à imagem selecionada.Este método deverá ter também alguns dos comandos abaixo:

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

		usuario.setCpf("09809808");
		usuario.setNome("nome");
		usuario.setBinariosImagem(bytes);
		System.out.println("gravando:" + bytes);
		usuarioDAO.gravar(usuario);
		
		}

Na tela, você deverá ter um DataGrid que exibe as informações do usuário.Deverá ser exibido também o campo foto.Você deverá ter um componente Image e o source deverá ?apontar? para o grid, como mostra a linha abaixo:

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

Tenta aí…qq coisa vou te ajudando…
t+

claudneto

Então não tem como fazer upload da foto pra um servidor?

Pelo menos não com Flex, né?!

E pra ligar essa minha aplicação há uma outra linguagem?

EDIT: Pq as vezes eu faço alterações e quando eu rodo o aplicativo ele não mostra? Muitas vezes eu reinicio o computador e ele mostra a aplicação alterada!

renzonuccitelli

claudneto:
Então não tem como fazer upload da foto pra um servidor?

Pelo menos não com Flex, né?!

E pra ligar essa minha aplicação há uma outra linguagem?

EDIT: Pq as vezes eu faço alterações e quando eu rodo o aplicativo ele não mostra? Muitas vezes eu reinicio o computador e ele mostra a aplicação alterada!

Tem como fazer upload sim. Basta usar a classe FileReference para isso, leia a documentação sobre o método upload. Olhe um vídeo do upload do Revelação Virtual, app que fiz em Air (Desktop do Flex).

As vezes ele não mostra a aplicação pq ele não atualizou o swf. Se vc estiver com build automático no Flash Builder, quando ele builda ele joga os arquivos compilados (swf e outras coisas) na pasta bin-debug. Assim a coisa só se atualiza se vc iniciar o projeto flex em modo debug do Flash Builder. Se vc quiser ver a atualização sem ser em modo debug, gere um release do projeto (File->Export->Release Project) que ele vai exportar os arquivos direitinho. Vc pode até apontar esse build direto no diretório do seu projeto web. Aí sim vc verá as alterações sem precisar reiniciar o comp. Qq coisa tenta dar um clean no projeto para ver se já mostra as atualizações.

O que acontece é que o swf não pode ficar lendo recursos de outros domínios, por questão de segurança. Mesmo isso é possível de ser fazer usando o crossdomain.xml. Mas se forem imagens do próprio domínio onde se encontra o swf, vc pode ler numa boa, bastando vc colocar a url da imagem em um componente Image. E recomendo não carregar as imagens através de chamadas remotas, e sim colocando o link da imagem. Isso pq vc irá carregar as imagens como array de bytes, aí já viu, se muita gente usar o serviço, vc vai estourar o heap space logo logo. Então o negócio é:

  1. Subir a imagem para o servidor usando FileReference, guardando em um diretório para ser acessado através de uma URL
  2. Guardar a URL no banco
  3. Usar a URL diretamente em um componente Image.

Precisando de um curso Flex, dê uma olhada nos da Nuccitec.

[]s

claudneto

Vou ler sim! Muito legal essa sua aplicação!

Eu apenas salvo o projeto e dou um Run nele. Não tem o Export -> Release Project no menu File. Já exportei de todas as formas possíveis, mas ele não muda. Já fui nos arquivoss swf na pasta do projeto e eles não mudam tbm. Tem outra forma de rodar a aplicação ou complilá-la de uma forma que já atualize os swf? Deu um clean e voltaram a funcionar. Acho que alguns ModuleLoader estavam com problema pq agora eles pararam de funcionar.

O que acontece é que o swf não pode ficar lendo recursos de outros domínios, por questão de segurança. Mesmo isso é possível de ser fazer usando o crossdomain.xml. Mas se forem imagens do próprio domínio onde se encontra o swf, vc pode ler numa boa, bastando vc colocar a url da imagem em um componente Image. E recomendo não carregar as imagens através de chamadas remotas, e sim colocando o link da imagem. Isso pq vc irá carregar as imagens como array de bytes, aí já viu, se muita gente usar o serviço, vc vai estourar o heap space logo logo. Então o negócio é:

  1. Subir a imagem para o servidor usando FileReference, guardando em um diretório para ser acessado através de uma URL
  2. Guardar a URL no banco
  3. Usar a URL diretamente em um componente Image.

Então, a minha ideia era upar as imagens pro servidor onde ficariam os swf mesmo e ter uma referência dentro do BD com o url da imagem. Porém, eu não sei como fazer o Flex upar a foto no servidor. Vou ler sobre a classe FileReference que vc disse pra ver.

Qualquer coisa, eu posto aqui novamente.

renzonuccitelli

No Flash Builder tem o Release Build. Veja no anexo.


claudneto

Ahhh é…to ficando cego!

Hahaha…

Mas agora foi…eu dei um clean e alguns ModuleLoader pararam de funcionar, mas rodou as mudanças!

Eu li sobre o método upload() da classe FileReference.


upload(request:URLRequest, uploadDataFieldName:String = “Filedata”, testUpload:Boolean = false):void
Starts the upload of the file to a remote server.

Não sei como funciona servidor e nem sei como faz upload de arquivos pra servidores! Essa URLRequest seria o que nesse caso? O uploadDataFieldName é o que? testUpload retorna true se funcionar e false se não funcionar?

renzonuccitelli

URLRequest só encapsula a url. Vc passa para o construtor uma string com a url para onde fará o upload. Em servidor comum eu tb nunca fiz upload, só fiz no Google App Engine. Mas acredito que se vc pesquisar encontrar fácil fácil.

[]s

claudneto

Mto obrigado! Vou ler sim como fazer upload!

R

Cara, Se for o caso de guardar a imagem no banco como binary ou image o Filereference.data retorna pra voce o arquivo num arrayde byte[]
só uma dica
flwww

Criado 12 de novembro de 2010
Ultima resposta 25 de nov. de 2010
Respostas 9
Participantes 4