如何从Java Servlet中的Multipart表单获取输入?

时间:2014-01-14 03:11:58

标签: java servlets file-upload

伙计们我一直在尝试上传一个包含来自表单字段的数据的文件,但我没有运气,我正在使用的servlet就在这里。正如你可以看到for初始化的那样,if是否存在,如果工作正常但是其余的condtional if被忽略并且没有数据被检索或显示(使用out.print)所以我在这里粘贴servlet代码希望有人能看到我看不到的小时和小时,请大家帮我解决这个问题。

import DAO.CuentaCobroDAO;
import DTO.CuentaCobroDTO;
import DTO.contratoDTO;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
*
* @author Leonardo
*/
public class CuentaCobroCtrol extends HttpServlet {

/**
 * 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, FileUploadException, ParseException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    CuentaCobroDAO ccdao= new CuentaCobroDAO();
    CuentaCobroDTO cdto= new CuentaCobroDTO();
    contratoDTO con= new contratoDTO();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    FileItemFactory fif= new DiskFileItemFactory();
    ServletFileUpload sfu= new ServletFileUpload(fif);
    String fechai="", fechaf="";
    String contrato, dias=null;
    String valor, arl=null, eps=null, pension=null;
    List items=sfu.parseRequest(request);
    java.sql.Date fi, ff, factual;
    Date fechaActual;

   try{ 
    for (int i = 0; i < items.size(); i++) {
        FileItem item = (FileItem) items.get(i);

        if(item.isFormField()){

            if(item.getFieldName().equals("fechai")){
            fechai=obtenerDatoDeFormulario(item.getInputStream());
           out.print(fechai);
            }

            if(item.getFieldName().equals("fechaf")){
                fechaf=obtenerDatoDeFormulario(item.getInputStream());
                out.print("FECHAF"+fechaf);
            }


            if(item.getFieldName().equals("numcont")){
                contrato=obtenerDatoDeFormulario(item.getInputStream());
                out.print("CONTRATO"+contrato);
            }
            if(item.getFieldName().equals("dias")){
                dias=obtenerDatoDeFormulario(item.getInputStream());
                out.println(dias);
            }
            if(item.getFieldName().equals("valor")){
                valor=obtenerDatoDeFormulario(item.getInputStream());
                out.print(valor);
            }
            if(item.getFieldName().equals("arl")){
                arl=obtenerDatoDeFormulario(item.getInputStream());
                out.println("Por ARL:"+arl);
            }
            if(item.getFieldName().equals("eps")){
                eps=obtenerDatoDeFormulario(item.getInputStream());
                out.println("Por EPS:"+eps);
            }
            if(item.getFieldName().equals("pension")){
                pension=obtenerDatoDeFormulario(item.getInputStream());
                out.println("Por PENSION:"+pension);
            }

            out.print("El valor 2 de fecha I es:"+fechai);

        }
        /*            A continuación validamos que los campos que vienen del formulario no estén vacios, esto en caso de que javascript falle,
        así garantizamos que tenemos todos los datos; hago esto antes de escribir el archivo en el servidor para evitar que se suba
        información que está incompleta y no debe ser subida sino hasta que se compruebe que se tienen todos los datos.*/
        out.print("El valor 3 de fechai es:"+fechai+"el de final es:"+fechaf);
            fechaActual=  new Date();
            Date inicial=formatter.parse(fechai);
            fi= new java.sql.Date(inicial.getTime());
            Date ffinal=formatter.parse(fechaf);
            ff= new java.sql.Date(ffinal.getTime());
            factual=new java.sql.Date(fechaActual.getTime());
            out.print("El valor 4:"+fechai+"Y el de final es:"+fechaf);
            if(fi.compareTo(factual)>0 || ff.compareTo(factual)>0){
                response.sendRedirect("nomina/cuentacobro.jsp?msg="+"Error, no puedes ingresar una cuenta del mes futuro o actual");
                break;
            }else if(dias!=null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Debes ingresar los días trabajados");
                break;
            }else if(30<Integer.parseInt(dias)){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= En el mes pueden ser máximo 30 días");
                break;
            }else if(arl==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Tienes que ingresar el valor de la ARL");
                break;
            }else if(eps==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Es necesario ingresar el valor de la EPS");
                break;
            }else if(pension==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Debes ingresar el valor de pensión");
                break;
            }else{
                String ruta="/archivos/pdf/"+request.getSession(false).getAttribute("iduser")+"/";
                String nombreArchivo=request.getSession(false).getAttribute("iduser")+"-"+factual;
                if(!item.isFormField()){


                    File archivoAServidor= new File(getServletContext().getRealPath(ruta+nombreArchivo));
                    try {
                        item.write(archivoAServidor);
                    } catch (Exception ex) {
                        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            cdto.setFinicial(fi);
            cdto.setFfinal(ff);
            cdto.setDias(Integer.parseInt(request.getParameter("dias")));
            cdto.setHoras(Integer.parseInt(request.getParameter("horas")));
            cdto.setPagoArl(Integer.parseInt(request.getParameter("arl")));
            cdto.setPagoEps(Integer.parseInt(request.getParameter("eps")));
            cdto.setPagoPension(Integer.parseInt(request.getParameter("pension")));
            cdto.setIdContratista((Integer)request.getSession(false).getAttribute("iduser"));
            cdto.setValorAPagar(Integer.parseInt(request.getParameter("valor")));
            con.setIdCONTRATO((Integer)request.getSession(false).getAttribute("idContrato"));
            cdto.setRutaDocumento(ruta+nombreArchivo);
            String salida=cdto.insertCuenta(cdto, con);
            response.sendRedirect("nomina/cuentacobro.jsp?msg="+salida);
            }
    }
   }catch(IOException iex){
       throw iex;
   }catch(ParseException pex){
       throw pex;
   }






    try {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet CuentaCobroCtrol</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet CuentaCobroCtrol at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}

private static String obtenerDatoDeFormulario(InputStream is){
    BufferedReader br=null;
    StringBuilder sb= new StringBuilder();

    String linea;


    try {
        br= new BufferedReader(new InputStreamReader(is));
        while((linea=br.readLine())!= null){
            sb.append(linea);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally{
        if(br!=null){
            try {
                br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    return sb.toString();

}


// <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 {
    try {
        processRequest(request, response);
    } catch (FileUploadException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ParseException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    }
}

/**
 * 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 {
    try {
        processRequest(request, response);
    } catch (FileUploadException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ParseException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    }
}

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

}

PD:out.print用于显示从场地收集的信息,但在处理完第一个If之后,其他人将被忽略。

3 个答案:

答案 0 :(得分:0)

我不确定这是否有用,因为我在本例中使用了注释,但这是一个上传文件并将其保存到文件系统的示例servlet:https://www.openshift.com/forums/openshift/how-to-upload-and-serve-files-using-java-servlets-on-openshift

答案 1 :(得分:0)

如果表单字段,您将获得上传的文件。所以,你的支票应该是:

 if(!item.isFormField()){
     String fileName = item.getName();
     InputStream is = item.getInputStream();
     // process the file
 } else {
     // Get the field name
     String fieldName = item.getName();
     // Get the field value
     String value = item.getString();
 }

退房 http://commons.apache.org/proper/commons-fileupload/using.html了解更多详情。

答案 2 :(得分:0)

好吧,经过很长一段时间的思考,我有一种天才的火花,终于意识到这个服务器发生了什么,所以explenation就在这里:

我首先要说的是,在开始时我无法理解当表单是一个多部分时数据是如何发送到servlet的,所以这是一个巨大的错误,我们必须指出每个表单字段都会发送到作为一个项目被修改,所以对于我使用的形式我有9个字段所以cicle将运行10次,这是错误,如果你分析我的第一个servlet你会发现我正在使用if(9次)然后一个嵌套,如果解析一个日期,这里整个事情都是错误的方式,因为当cicle迭代找到的每个项目然后它将评估所有在if的主体上找到的if所以只有第一个cicle我已经有一个不可解析的日期异常,这里什么都没有用,所以请记住,当使用Iterator进行cicles时,或者每次运行时,它会运行次数等于评估cicle内部的项目数量,所以要小心你的条件是什么评估以及如何做到这一点。所以在这里我将放置正确的servlet,它完全符合我的要求,即:获取表单字段的内容然后获取文件在服务器上写入,写入并最终将表单字段的信息存储在数据库。 在这里你可以找到servlet(借口,如果有些代码令人困惑,可能是因为它是用西班牙语写的)

package controlador;

import DAO.CuentaCobroDAO;
import DTO.CuentaCobroDTO;
import DTO.contratoDTO;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.File;
import java.io.PrintWriter;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Calendar;


/**
*
* @author Leonardo
*/
public class CuentaCobroCtrol extends HttpServlet {

/**
 * 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, FileUploadException, ParseException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();                
    String fechaIni="";
    String fechaFin="";
    String contrato="";
    String valorArl="";
    String valorEps="";
    String valorPension="";
    String valorAPagar="";
    String numeroDias="";
    String ruta="";
    String nombreArchivo="";
    String timeStamp="";
    boolean suceed=false;
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
    CuentaCobroDAO ccdao= new CuentaCobroDAO();
    CuentaCobroDTO cdto= new CuentaCobroDTO();
    contratoDTO con= new contratoDTO();


    FileItemFactory ff = new DiskFileItemFactory();



    ServletFileUpload sfu = new ServletFileUpload(ff);



    List items = sfu.parseRequest(request);
    java.sql.Date fi=null, fif=null, factual=null;
    Date fechaActual;

   try{ 


       for(int i=0;i<items.size();i++){



        FileItem item = (FileItem) items.get(i);

        if (item.isFormField()){  

                         /*            A continuación validamos que los campos que vienen del formulario no estén vacios, esto en caso de que javascript falle,
        así garantizamos que tenemos todos los datos; hago esto antes de escribir el archivo en el servidor para evitar que se suba
        información que está incompleta y no debe ser subida sino hasta que se compruebe que se tienen todos los datos.*/
          if(item.getFieldName().equals("numcont")){
              contrato=getStringFromInputStream(item.getInputStream());
              out.print("<br/>  el valor de numero es: "+contrato);  
          }
          if(item.getFieldName().equals("dias")){
              numeroDias=getStringFromInputStream(item.getInputStream());
              out.print(" <br/> el valor de dias es: "+numeroDias);  
              if(numeroDias==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Debes ingresar los días trabajados");
                break;}else if(30<Integer.parseInt(numeroDias)){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= En el mes pueden ser máximo 30 días");
                break;
            }
          }
          if(item.getFieldName().equals("valor")){
              valorAPagar=getStringFromInputStream(item.getInputStream());
              out.print(" <br/> el valor  es: "+valorAPagar); 
              if(Integer.parseInt(valorAPagar)<=0 || valorAPagar==null){
                  response.sendRedirect("nomina/cuentacobro.jsp?msg= El valor no puede ser nagativo o nulo. Por favor ingresa el valor a pagar");
              }
          }
          if(item.getFieldName().equals("arl")){
              valorArl=getStringFromInputStream(item.getInputStream());
              out.print(" <br/> el valor de arl es: "+valorArl);  
              if(valorArl==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Tienes que ingresar el valor de la ARL");
                break;
            }
          }
          if(item.getFieldName().equals("eps")){
              valorEps=getStringFromInputStream(item.getInputStream());
              out.print(" <br/> el valor de eps es: "+valorEps);  
              if(valorEps==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Es necesario ingresar el valor de la EPS");
                break;
            }
          }
          if(item.getFieldName().equals("pension")){
              valorPension=getStringFromInputStream(item.getInputStream());
              out.print(" <br/> el valor de pension es: "+valorPension); 
              if(valorPension==null){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Debes ingresar el valor de pensión");
                break;
            }
          }
           if(item.getFieldName().equals("fechai"))  
        {  
            fechaIni=getStringFromInputStream(item.getInputStream());
            out.print("el valor de fechaInicial es: "+fechaIni);
            if(fechaIni==null || fechaIni.length()<4){
                response.sendRedirect("nomina/cuentacobro.jsp?msg= Error, no ingresaste el valor de fecha periodo inicial");
            }
        }
          if(item.getFieldName().equals("fechaf")){
              fechaFin=getStringFromInputStream(item.getInputStream());
              fechaActual=  new Date();
            Date inicial=formatter.parse(fechaIni);
            fi= new java.sql.Date(inicial.getTime());
            Date ffinal=formatter.parse(fechaFin);
            fif= new java.sql.Date(ffinal.getTime());
            factual=new java.sql.Date(fechaActual.getTime());
            if(fi.compareTo(factual)>0 || fif.compareTo(factual)>0){
                response.sendRedirect("nomina/cuentacobro.jsp?msg="+"Error, no puedes ingresar una cuenta del mes futuro o actual");
                break;
            }

          }
     }

        if(!item.isFormField()){
               timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
               ruta="/archivos/pdf/"+request.getSession(false).getAttribute("iduser")+"/";
               nombreArchivo=request.getSession(false).getAttribute("iduser")+"-"+timeStamp+".pdf";
                    File dir=new File(ruta+nombreArchivo);
                    dir.mkdirs();
                    File archivoAServidor= new File(getServletContext().getRealPath(ruta+nombreArchivo));

                    try {
                        item.write(archivoAServidor);
                        suceed=true;
                    } catch (Exception ex) {
                        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
    }
    if(suceed==true){
        cdto.setFinicial(fi);
            cdto.setFfinal(fif);
            cdto.setDias(Integer.parseInt(numeroDias));
            cdto.setHoras(Integer.parseInt("0"));
            cdto.setPagoArl(Integer.parseInt(valorArl));
            cdto.setPagoEps(Integer.parseInt(valorEps));
            cdto.setPagoPension(Integer.parseInt(valorPension));
            cdto.setIdContratista((Integer)request.getSession(false).getAttribute("iduser"));
            cdto.setValorAPagar(Integer.parseInt(valorAPagar));
            con.setIdCONTRATO((Integer)request.getSession(false).getAttribute("idContrato"));
            cdto.setRutaDocumento(ruta+nombreArchivo);
            String salida=cdto.insertCuenta(cdto, con);
            response.sendRedirect("nomina/cuentacobro.jsp?msg="+salida);
    }



   }catch(IOException iex){
       throw iex;
   }catch(ParseException pex){
       throw pex;
   }






    try {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet CuentaCobroCtrol</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet CuentaCobroCtrol at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}

private static String getStringFromInputStream(InputStream is) {

    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    String line;
    try {

        br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return sb.toString();

}


// <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 {
    try {
        processRequest(request, response);
    } catch (FileUploadException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ParseException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    }
}

/**
 * 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 {
    try {
        processRequest(request, response);
    } catch (FileUploadException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ParseException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(CuentaCobroCtrol.class.getName()).log(Level.SEVERE, null, ex);
    }
}

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

}