Upload de arquivos direto no BD

10 respostas
J

Pessoal,

Fiz uma action do struts que persisti arquivos indicados pelo usuario no form html, estou usando JSP+HIBERNATE+STRUTS, funcionou, o problema agora está em mostrar esse arquivo salvo no BD (praticamente são só fotos) no browser, alguem sabe como posso fazer isso, tentei fazer um action pra trazer as informações do BD(byte[]) e jogar dentro de um FileOutputStream, mas estou sem muita ideia. Salvo em um campo blob do MySQL.

Minha action para persitir:

import catalogo.controle.forms.UploadForm;
import catalogo.dao.GenericDAO;
import catalogo.modelo.FotoT;
import catalogo.util.HibernateUtil;
import java.io.File;
import java.io.FileInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class UploadAction extends org.apache.struts.action.Action {
       
    private String retorno;

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        UploadForm upload = (UploadForm) form;

        FotoT foto = new FotoT();

        foto.setNome(upload.getFoto().getFileName());
        foto.setFoto(upload.getFoto().getFileData());

        Session session = HibernateUtil.getSession();

        GenericDAO dao = new GenericDAO(session, FotoT.class);

        String msg = null;

        try
        {
            if (upload.getFoto().getFileSize() > 1048576)
            {
                retorno = "upload";
                msg = "O tamanho do arquivo não pode ultrapassar 1 MB!";
            }
            else
            {
                dao.salvar(foto);
                retorno = "ok";
            }
        }
        catch (Exception e)
        {
            //t.rollback();
            retorno = "erro";
            msg = "Erro: " + e.getMessage();
        }        

        request.setAttribute("msg", msg);
        return mapping.findForward(retorno);
    }
}

Se alguem puder me ajudar, argadeço

10 Respostas

alias

Não rola de voce criar um servlet, e a url desse servlet criado voce jogar aqui…

aí lá dentro,no método service voce recupera a imagem…

se tiver dificuldade nesse ponto avise ai que eu posto um exemplo

J

Como seria o método para recuperar a imagem?
Estou usando Struts e Hibernate, queria continuar utilizando os dois juntos nesse caso tambem, mas se for preciso um servlet apenas para mostrar a imagem, nao tem problemas.

J

Sera que tem como mostrar essa imagem que vem do BD (array de bytes) com EL?

alias

Bom, na real, velho, nao conheço muito so Struts, vou colocar um codigo que gera a imagem em um Servlet e de qualquer forma você pode utilizar, ou adaptar pra algo no Struts

Lembrando, pra este exemplo, crie o Servlet e sobrescreva o metodo service

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    resp.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT");  
    resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  
    resp.addHeader("Cache-Control", "post-check=0, pre-check=0");  
    resp.setHeader("Pragma", "no-cache");
		
    try{
        bytes[] buffer = //Metodo qualquer que vai retornar o seu array de bytes da base
     	
        ServletOutputStream output = resp.getOutputStream();
				
        output.write(buffer;
        output.flush();
	output.close();	
    		
    } catch (Exception e) {
        throw new ServletException(e);
    }
J

Alguem pode me ajudar a mostra a imagem vinda do BD (byte[]) no meu arquivo jsp, usando Struts + hibernate e/ou EL?
Ja pesquisei e nada até agora, nao sei mais o que faço. Nao consegui adaptar o topico do alias pra usa-lo com Struts, se alguem puder ajudar, agradeço.

Eu tenho uma tabela com o nome do arquivo que foi submetido e seu array de dados, quero mostrar em um jsp todas as imagens cadastradas, mas nao sei como. Conto com voces.

Desde ja agradeço.

Guevara

Olá!
No fórum existem uns casos para campos blob, veja se consegue extrair algo:
http://www.guj.com.br/posts/list/133988.java#721156
http://www.guj.com.br/posts/list/145423.java#783805
http://www.guj.com.br/posts/list/206105.java#1046749
Abraço!

alias

JeffersonJCosta:
Alguem pode me ajudar a mostra a imagem vinda do BD (byte[]) no meu arquivo jsp, usando Struts + hibernate e/ou EL?
Ja pesquisei e nada até agora, nao sei mais o que faço. Nao consegui adaptar o topico do alias pra usa-lo com Struts, se alguem puder ajudar, agradeço.

Eu tenho uma tabela com o nome do arquivo que foi submetido e seu array de dados, quero mostrar em um jsp todas as imagens cadastradas, mas nao sei como. Conto com voces.

Desde ja agradeço.

Não rola só criando o servlet mano?
O exemplo que deixei atende perfeitamente essa situação…caso voce possa criar um servlet pra renderizar a imagem, claro.

E lembrando que a url desse servlet deve ser passada para o atributo src da sua tag

J

Vou tentar com esse servlet mesmo, mas como posso utiliza-lo para mostrar uma lista de imagens (todas que estao cadastradas no BD)?

alias

Quando precisei fazer isso usando esse servlet para gerar a imagem, eu passei um parametro na url que voce deve associar ao src da sua tag . Esse parametro era um id sobre o qual eu conseguia achar a imagem no banco.

Ou seja, chamei esse servlet para cada imagem que deveria ser gerada na pag. Não sei se é a melhor forma…

J

Entendi.

Todos os exemplos que vi até agora só mostram com uma iamgem de cada vez, utilizando o seu id. Consegui mostrar uma imagem, seguindo o exemplo que voce deu (Servlet), mas não consegui usando o action do struts, agora estou querendo saber como vou mostrar todas as imagens que estao no BD, de qualquer forma, muito obrigado pela ajuda até agora.

Meu Servlet ficou assim:
package catalogo.util;

import catalogo.dao.FotoDAO;
import catalogo.modelo.Foto;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;

public class ExibirImagem extends HttpServlet {
   
    @Override  
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
         
        resp.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT");
        resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        resp.addHeader("Cache-Control", "post-check=0, pre-check=0");
        resp.setHeader("Pragma", "no-cache");

        try
        {
            Session session = HibernateUtil.getSession();
            FotoDAO fotoDao = new FotoDAO(session, Foto.class);
            Foto foto = fotoDao.carregarFotoPeloId(2);

            byte[] buffer = foto.getDados();

            ServletOutputStream output = resp.getOutputStream();

            output.write(buffer);
            output.flush();
            output.close();
        }
        catch (Exception e)
        {
             throw new ServletException(e); 
        }
    }
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet ExibirImagem</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet ExibirImagem at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
            */
        } finally { 
            out.close();
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
A minha action do struts ficou assim:
package catalogo.controle.actions;

import catalogo.dao.FotoDAO;
import catalogo.modelo.Foto;
import catalogo.util.HibernateUtil;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Session;

public class TesteAction extends org.apache.struts.action.Action {
      
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        response.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT");
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");

        try
        {
            Session session = HibernateUtil.getSession();
            FotoDAO fotoDao = new FotoDAO(session, Foto.class);
            Foto foto = fotoDao.carregarFotoPeloId(2);
            
            byte[] buffer = foto.getDados();

            ServletOutputStream output = response.getOutputStream();
            
            output.write(buffer);
            output.flush();
            output.close();
        }
        catch (Exception e)
        {
            e.getMessage();
        }

        return mapping.findForward("teste");
    }
}

Se alguem souber pelo menos como posso fazer para mostrar a imagem usando o struts, ao invez de servle, ja agradeço.

Criado 17 de maio de 2010
Ultima resposta 20 de mai. de 2010
Respostas 10
Participantes 3