Recuperando um bytea e mostrando na displaytag[Resolvido]

A solução que encontrei foi a seguinte:

Objeto:
Code:

 private byte[] arv_foto;
 private String arv_foto_nome; 
 

——————————Inserindo no banco———————————
Action:
Code:

 FileItem file_foto = (FileItem) input.getValue("arv_foto");
 nome = file_foto.getName();
 int pos = nome.lastIndexOf("\\");
 nome = nome.substring(pos + 1);
 


Code:

 pojoArvore.setArv_foto(file_foto.get()); //Aqui eu guardo a foto no 
 banco(bytea)
 pojoArvore.setArv_foto_nome(nome); //aqui eu pego o nome da imagem
 

——————————Mostrando———————————
//Para mostrar a imagem, em um certo momento eu carrego as imagem para o meu contextPath:

Code:

 public void gerarImagens() {
         List<PojoArvore> listArvores = DaoArvore.getInstance().readByExample(null);
         String strRealPath = org.mentawai.core.ApplicationManager.getRealPath();
         for (Object object : listArvores) {
             PojoArvore objArvore = (PojoArvore) object;
             if (objArvore.getArv_foto() != null) {
                 String strFullPath = strRealPath.replace("\\", "/") + ArvoreShowFormAction.DEFAULT_DIR + objArvore.getArv_foto_nome();
                 System.out.println(strFullPath);
                 File objFile = new File(strFullPath);
                 if (!objFile.exists()) {
                     try {
                         FileOutputStream objFileOutStream = new FileOutputStream(strFullPath);
                         objFileOutStream.write(objArvore.getArv_foto());
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
         }
     }
 

——————————-Na displaytag———————————

Code:

 <display:column title="Foto" >
       <a href='${pageContext.request.contextPath}/Arvore/Ampliar.do?arv_id=${row.arv_id}'>
       <img src="${pageContext.request.contextPath}/images/arvores/${row.arv_foto_nome}" align="right" width="180" height="100"                                         name="fotoImage" alt="foto" title="clique para ampliar"                                                                                                />
        </a>                                           
 </display:column>
 

//Fica melhor se colocar no decorator fazendo o download da imagen do banco para o contextpath, uma a uma.

Outra opção sugerida por EduardoJLRufino no Forum Mentawai:

1. Quando você fazer o upload das fotos, ao invés de salvar no banco vc salva em uma pasta uploads (que vai ficar dentro da web)

vc salva em uma pasta usando:

Code:

FileItem arquivo = (FileItem) input.getValue(“arv_foto”);

File arquivoDisco = new File(ApplicationManager.getRealPath() + SEP + caminhoRelativo); // onde vc quer salvar…

arquivoDisco.getParentFile().mkdirs(); // Criar diretorio, caso ele não exita.

arquivo.write(arquivoDisco);

// Colocar o caminho no padrão de URL (Necessário para o Windows)

caminhoRelativo = caminhoRelativo.replaceAll(“\\\\”, “/”);

Foto foto = new Foto()

foto.setCaminhoImagem(caminhoRelativo);

dao.save(foto);
2. Seu Bean vai ter:
Foto..
String nome;
String caminhoImagem;

3. Para listar as imagens, ao invés de vc listar do sistema de arquivos
vc lista do banco
Code:

List<Foto> fotos = FotoDao().listar();

ouput.setValue(“fotos”, fotos);

na JSP…, dentro da displaytag…

Code:

<img src=”${pageContext.request.contextPath}/${row.foto.caminhoImagem}” align=”right” width=”180″ height=”100″

—————————————————————————————————————————–

Fonte: Fórum Mentawai

Abraço,

No comments yet.