2011-09-16 18 views
7

tengo el siguiente formulario HTML:HttpServletRequest # getParts() devuelve una lista vacía

<form enctype="multipart/form-data" method="post" action="/myservlet"> 
    <input type="file" name="mptest"> 
    <br /> 
    <input type="submit" value="upload"> 
</form> 

Y tengo el siguiente servlet que he creado en base a this answer:

package com.functions; 

import java.io.*; 
// import java.sql.Connection; 
// import java.sql.PreparedStatement; 
// import java.sql.ResultSet; 
// import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.Part; 

// import com.functions.utility.DBConnector; 
public class restore extends HttpServlet { 

    private static final long serialVersionUID = 8097085789553030042L; 

    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("--------------------"); 
     System.out.println(" On restore.java "); 
     System.out.println("--------------------"); 
     try { 
      fetchDataFromDB(request, response); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private void fetchDataFromDB(HttpServletRequest request, 
      HttpServletResponse response) throws InterruptedException, 
      IllegalStateException, ServletException { 
     try { 
      System.out.println("Test 1"); 
      for (Part part : request.getParts()) { 
       String filename = getFilename(part); 
       System.out.println("Test 2"); 
       if (filename == null) { 
        System.out.println("Test 3"); 
        // Process regular form field (input 
        // type="text|radio|checkbox|etc", select, etc). 
        String fieldname = part.getName(); 
        System.out.println(fieldname); 
        String fieldvalue = getValue(part); 
        System.out.println(fieldvalue); 
        // ... (do your job here) 
       } else if (!filename.isEmpty()) { 
        System.out.println("Test 4"); 
        // Process form file field (input type="file"). 
        String fieldname = part.getName(); 
        System.out.println(fieldname); 
        filename = filename 
          .substring(filename.lastIndexOf('/') + 1) 
          .substring(filename.lastIndexOf('\\') + 1); // MSIE 
                     // fix. 
        InputStream filecontent = part.getInputStream(); 
        System.out.println(filecontent); 
        String[] command = new String[] { 
          "C:/Program Files (x86)/MySQL/MySQL Server " 
          + "5.5/bin/mysql", 
          "--user=root", "--password=root", "dummy", "-e", 
          "source "+"C:/Users/John/Desktop/LMS/backup.sql" }; 
        Process restore = Runtime.getRuntime().exec(command); 
        int check = restore.waitFor(); 
        System.out.println(check); 
       } 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private static String getFilename(Part part) { 
     for (String cd : part.getHeader("content-disposition").split(";")) { 
      if (cd.trim().startsWith("filename")) { 
       return cd.substring(cd.indexOf('=') + 1).trim() 
         .replace("\"", ""); 
      } 
     } 
     return null; 
    } 

    private static String getValue(Part part) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       part.getInputStream(), "UTF-8")); 
     StringBuilder value = new StringBuilder(); 
     char[] buffer = new char[1024]; 
     for (int length = 0; (length = reader.read(buffer)) > 0;) { 
      value.append(buffer, 0, length); 
     } 
     return value.toString(); 
    } 
} 

Pero el bucle en request.getParts() nunca se ingresa. ¿Cómo es esto causado y cómo puedo resolverlo?

+0

posible duplicado de [¿Cómo subir archivos en JSP/servlet?] (Http://stackoverflow.com/questions/2422468/how-to-upload-files-in-jsp-servlet/2424824#2424824) – BalusC

+0

Mi respuesta a la pregunta que vinculó menciona en la parte inferior algunos enlaces sobre cómo procesar el archivo cargado en JSP/Servlet. – BalusC

+0

Intenté la sugerencia que hizo en el enlace ... pero ni siquiera ingresó al ciclo for ..... – John

Respuesta

17

Si desea utilizar Servlet 3.0 HttpServletRequest#getParts(), debe anotar su servlet con @MultipartConfig.

@WebServlet(urlPatterns={"/myservlet"}) 
@MultipartConfig 
public class Myservlet extends HttpServlet { 

    // ... 
} 
+0

todavía me da backup.sql y no C:/Users/John/Desktop/LMS/backup. sql – John

+3

¿Por qué en la tierra necesitas la ruta completa? Lea http://stackoverflow.com/questions/81180/how-to-get-the-file-path-from-html-input-form-in-firefox-3/3374408#3374408 Solo obtenga el contenido del archivo y guárdelo al disco del servidor y luego invocar su comando en la ruta del archivo guardado. – BalusC

+0

Agregar la anotación '@ MultipartConfig' no ayudó en mi caso (Tomcat 7.0.70 con Servlet 3.0) – basZero

Cuestiones relacionadas