Erro ao salvar uma foto no banco mysql

5 respostas
J

Pessoal,
Estou com este problema a dois dias e já cansei de pesquisar porque meu código não está conseguindo salvar uma foto .jpg no banco mysql.
Não pretendo salvar o caminho, tenho que salvar a foto.

Estou usando Struts2, Hibernate.

Na minha jsp está configurado assim o atributo:
<s:file name=“pessoa.foto” label=“Salvar foto do Contato”></s:file>
Obs.: sem este atributo tudo funciona normalmente, mais com ele.

e minha classe Pessoa está assim:

@Transient private Image fotoImg; //ou seja isso aqui não é persistido   
private byte[] foto;

 @Column(name="imagem")
	 @Lob
	 public Image getFoto() {   
         return fotoImg;     
    }     
    
    public void setFoto(Image foto) {     
         this.foto = ((DataBufferByte)((BufferedImage)foto).getRaster().getDataBuffer()).getData();   
         this.fotoImg = foto;   
    }   
 
    public void setFoto(byte[] foto) {     
         setFoto(Toolkit.getDefaultToolkit().createImage(foto));   
    }   
 
    @PostLoad //apos carregar do banco de dados, seta o campo fotoImg   
    public void criaImg() {   
         fotoImg = Toolkit.getDefaultToolkit().createImage(foto);   
    }

quando mando salvar da erro de validação.
HTTP Status 404 - No result defined for action br.com.cerimonial.action.PessoaAction and result input

O que eu estou fazendo de errado galera? Desde já obrigado.

5 Respostas

Rafael_Carneiro

Tá faltando configurar o tipo de retorno (result).

J

Mais como eu configuraria este retorno, pois se tiro este campo de foto o resto funciona normalmente?

Rafael_Carneiro

Algo como:

<action name="list" method="execute" class="personAction">
            <result>pages/list.jsp</result>
            <result name="input">pages/list.jsp</result>
</action>
J

Já estava configurado Rafael. O erro começou depois que eu acrescentei foto. A classe Pessoa tem vários outros atributos e funcionando legal, mais quando coloco este atributo e o campo no banco tá dando isto.
meu xml está funcionando assim :

<action name="salvar" method="salvar" class="br.com.cerimonial.action.PessoaAction">
   <result>/jsp/pessoa/mostrarPagina.jsp</result>
</action>

O método salvar:

@Override
public String salvar() throws Exception {
getPessoa().setAtualizacao(data);   
   if (getPessoa() != null) {
   dao.salvar(getPessoa());
}
return SUCCESS;
}

E meu dao:

public void salvar(Pojo pojo) {
Session sessao = HibernateUtil.getSessao();
HibernateUtil.iniciarTransacao();

if (pojo.getId() == null)
sessao.save(pojo);
else
sessao.update(pojo);
HibernateUtil.commit();
HibernateUtil.fechar();
}

E aí não sei o que está acontecendo que está dando errado ao incluir um jpg

jyoshiriro

Jamil,

ainda não vi o mapeamento de “input” no seu XML.
E outra, para fazer upload deve-se usar um campo do tipo File e não byte[] numa Action.
Você poderia enviar o código completo de sua action?

Normalmento esse erro ocorre quando o tamanho do arquivo é grande.
No JSP que receber o mapeamento de input, use as tags <s:actionerror/> e <s:fielderror/> para que o struts2 te “diga” qual o erro, ok?

Observação: vi um trecho de commit em seu DAO. Isso não é uma boa prática. Já pensou se tivesse que reaproveitar esse mesmo “salvar” no inico outro caso de uso que desse um erro depois? Como fazer o rollback depois? Tente usar algum mecanismo de injeção de transações como o Spring + Spring plugin ou o Full Hibernate Plugin (http://cwiki.apache.org/S2PLUGINS/full-hibernate-plugin.html)

Criado 10 de junho de 2009
Ultima resposta 3 de ago. de 2009
Respostas 5
Participantes 3