Upload de Arquivo em MVC que não funciona! [Resolvido]

16 respostas
L

Boa noite, estou tentando desenvolver um programa de upload de arquivos em MVC.
Mais estou com problema, quando tenta fazer upload de arquivos, dá erro na pagina [size=18] HTTP-404-/Prod/Controle[/size] e não grava no bando de dados…

estou passando meu código para alguem me ajudar???
Este é minha Controle

package Controle;

import Negocio.Teste;
import Negocio.TesteDao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;



public class Controle extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        boolean isMultiPart = FileUpload.isMultipartContent(request);

        if (isMultiPart) {
            FileItemFactory factory = new DiskFileItemFactory();

            ServletFileUpload upload = new ServletFileUpload(factory);

            String formulario = "";

            try {

                List items = upload.parseRequest(request);

                Iterator iter = items.iterator();

                while (iter.hasNext()) {

                    FileItem item = (FileItem) iter.next();

                    if (item.getFieldName().equals("tipoForm")) {

                        formulario = item.getString();

                    }

                    if (!item.isFormField()) {

                        if (item.getName().length() > 0) {

                            this.inserirImagemDiretorio(item);
                            System.out.println("Ok");

                        }

                    }

                }

            } catch (FileUploadException ex) {

                ex.printStackTrace();

            } catch (Exception ex) {

                ex.printStackTrace();

            }

        }


    }

    private void inserirImagemDiretorio(FileItem item) throws
            IOException {



//Pega o diretório /logo dentro do diretório atual de onde a

//aplicação está rodando

        String caminho = getServletContext().getRealPath("/logo")
                + "/";



// Cria o diretório caso ele não exista

        File diretorio = new File(caminho);

        if (!diretorio.exists()) {

            diretorio.mkdir();

        }



// Mandar o arquivo para o diretório informado

        String nome = item.getName();

        String arq[] = nome.split("\\\\");

        for (int i = 0; i < arq.length; i++) {

            nome = arq[i];

        }



        File file = new File(diretorio, nome);

        FileOutputStream output = new FileOutputStream(file);

        InputStream is = item.getInputStream();

        byte[] buffer = new byte[2048];

        int nLidos;

        while ((nLidos = is.read(buffer)) >= 0) {

            output.write(buffer, 0, nLidos);

        }

        output.flush();

        output.close();

        TesteDao tesDao = new TesteDao();
        Teste teste = new Teste();
        teste.setImagem(caminho);
        tesDao.Cadastar(teste);


    }

    // <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>
}

Regras de Negocios

package Negocio;

import java.sql.Connection;
import java.sql.PreparedStatement;


public class TesteDao {

	 public void Cadastar(Teste teste) {
	        Conexao con = new Conexao();
	        Connection conexao = con.getConexao();
	        try {

	            String sql = "INSERT INTO teste(imagem)values(?)";

	            PreparedStatement pstmt = conexao.prepareStatement(sql);
	           
	            pstmt.setString(1, teste.getImagem());

	            pstmt.execute();

	        } catch (Exception e) {
	            e.printStackTrace();
	            System.out.println("Erro no sistema verificar as:" + e.getMessage());
	        }
	    }	
}

package Negocio;

public class Teste {
	private int codigo;
	private String imagem;

	public int getCodigo() {
	return codigo;
	
}
	public String getImagem() {
		return imagem;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public void setImagem(String imagem) {
		this.imagem = imagem;
	}
	

}

Minha jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form id="formImagem" name="formImagem" method="post" action="Controle" enctype="multipart/form-data">

            <input type="hidden" id="tipoForm" name="tipoForm" value="imagem">

            <input name="imagem" type="file" accept="image/jpeg; image/gif; image/bmp; image/png" id="imagem" class="dados" maxlength="60" tabindex="1" value="c:/" style="position:absolute; top:23px; left:12px;  width:500px; "/>

            <input type="submit" id="upload" name="upload" tabindex="2" style="position:absolute; top:20px; left:532px;" />
        </form>
    </body>
</html>

16 Respostas

Hebert_Coelho

Como está mapeado a sua action? action=“Controle”

L

tá sim!!!

L

tá sim!!!

a jsp eu coloquei no topico tbm…

Hebert_Coelho

Eu pergunte como?

No web.xml? No Struts?

como ela está mapeada? Tem como postar?

E

vou detalhar um pouco mais o ponto levantado pelo jakefrog.

o action do form te encaminha a uma página através do próprio browser, nesse caso ele vai buscar a página ./Controle. Se não tiver alguma forma de você pegar essa requisição (por exemplo, mapear um filter, um servlet, ou qualquer coisa do tipo) vai dar erro 404 (não encontrado) mesmo.

L

jakefrog:
Eu pergunte como?

No web.xml? No Struts?

como ela está mapeada? Tem como postar?

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Controle</servlet-name>
        <servlet-class>Controle.Controle</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Controle</servlet-name>
        <url-pattern>/Controle</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

então eu achei problema do erro HTTP 404 e resolvi, mais agora está passando outro erro na Página HTTP 500-
que aparece este erro abaixo na jsp… tentei verificar no log do tom cat e indica que esta com problema na Controle nesta parte do codigo
[color=red] List items = upload.parseRequest(request); [/color] e tentei achar uma solução mais não consegui!
observa ai por favor

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
	org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
	Controle.Controle.processRequest(Controle.java:39)
	Controle.Controle.doPost(Controle.java:173)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
	Controle.Controle.processRequest(Controle.java:39)
	Controle.Controle.doPost(Controle.java:173)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.11 logs.
E

vc tem o apache commons fileupload no seu classpath?

L

então já configurei na variavel de ambiente no classpath e também adicionei na biblioteca do projeto pois estou usando o Neatbeans…

ainda continua passando o mesmo erro acima!
indica o erro na Servlet Controle List items = upload.parseRequest(request);

E

e o commons io está no seu classpath?

L

ai como faço isso e tem que abaixar o algum arquivo???
detalhe sou novo em java!

E

esse aqui é o commons io.

Aqui lista as dependências do commons fileupload, repare que algumas você já deve ter no seu servlet container (por exemplo, servlets.jar)

L

evefuji:
esse aqui é o commons io.

Aqui lista as dependências do commons fileupload, repare que algumas você já deve ter no seu servlet container (por exemplo, servlets.jar)


ai funcionou sim… só tem problema para registrar… no banco de dados está registrando assim

C:\Net\Prod\build\web\logo/,
, mais estou tentando registrar assim C:\Net\Prod\build\web\logo\Figura1.jpe
ai você poderia me ajudar como faço para registrar no banco de dados? diretorio+nome_arquivo.jpg

E

se vc tem o objeto File que faz referência ao arquivo, pode usar o getAbsolutePath()

L
evefuji:
se vc tem o objeto File que faz referência ao arquivo, pode usar o getAbsolutePath()
fiz a referencia.. mais continua o problema... olha o codigo para ver por favor........
package Controle;

import Negocio.Teste;
import Negocio.TesteDao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;



public class Controle extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        boolean isMultiPart = FileUpload.isMultipartContent(request);

        if (isMultiPart) {
            FileItemFactory factory = new DiskFileItemFactory();

            ServletFileUpload upload = new ServletFileUpload(factory);

            String formulario = "";

            try {

                List items = upload.parseRequest(request);

                Iterator iter = items.iterator();

                while (iter.hasNext()) {

                    FileItem item = (FileItem) iter.next();

                    if (item.getFieldName().equals("tipoForm")) {

                        formulario = item.getString();

                    }

                    if (!item.isFormField()) {

                        if (item.getName().length() > 0) {

                            this.inserirImagemDiretorio(item);
                            System.out.println("Ok");

                        }

                    }

                }

            } catch (FileUploadException ex) {

                ex.printStackTrace();

            } catch (Exception ex) {

                ex.printStackTrace();

            }

        }


    }

    private void inserirImagemDiretorio(FileItem item) throws
            IOException {




        String caminho = getServletContext().getRealPath("/logo")
                + "/";



        File diretorio = new File(caminho);

        if (!diretorio.exists()) {

            diretorio.mkdir();

        }


   String nome = item.getName();

        String arq[] = nome.split("\\\\");

        for (int i = 0; i < arq.length; i++) {

            nome = arq[i];

        }

[i]
[b]String dire= diretorio.getAbsolutePath();[/b][/i]
        File file = new File(dire,nome);

[i][b]        FileOutputStream output = new FileOutputStream(file.getAbsolutePath());[/b][/i]

        InputStream is = item.getInputStream();

        byte[] buffer = new byte[2048];

        int nLidos;

        while ((nLidos = is.read(buffer)) >= 0) {

            output.write(buffer, 0, nLidos);

        }

        output.flush();

        output.close();

        TesteDao tesDao = new TesteDao();
        Teste teste = new Teste();
        teste.setImagem(caminho);
        tesDao.Cadastar(teste);


    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
E

no setImagem, no lugar de passar “caminho”, passa “file.getAbsolutePath()

L

Ok funcionou muito obrigado

Criado 2 de janeiro de 2012
Ultima resposta 6 de jan. de 2012
Respostas 16
Participantes 3