2013-03-31 15 views
14

Realizzare un progetto e richiedere il caricamento del file. Quindi, sto usando enctype = "multipart/form-data" informa.Servlet ottiene parametri dal modulo multipart in tomcat 7

Ma non riesco a analizzare i parametri dalla richiesta. Ho provato anche getPart ma restituisce una stringa vuota.

codice Servlet ->

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
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.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class upload_wall extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    // location to store file uploaded 
    private static final String UPLOAD_DIRECTORY = "image_upload"; 
    // upload settings 
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB 
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB 
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 

     // checks if the request actually contains upload file 
     if (!ServletFileUpload.isMultipartContent(request)) { 
      // if not, we stop here 
      PrintWriter writer = response.getWriter(); 
      writer.println("Error: Form must has enctype=multipart/form-data."); 
      writer.flush(); 
      return; 
     } 

     // configures upload settings 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     // sets memory threshold - beyond which files are stored in disk 
     factory.setSizeThreshold(MEMORY_THRESHOLD); 
     // sets temporary location to store files 
     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     ServletFileUpload upload = new ServletFileUpload(factory); 

     // sets maximum size of upload file 
     upload.setFileSizeMax(MAX_FILE_SIZE); 

     // sets maximum size of request (include file + form data) 
     upload.setSizeMax(MAX_REQUEST_SIZE); 

     // constructs the directory path to store upload file 
     // this path is relative to application's directory 
     String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; 

     // creates the directory if it does not exist 
     File uploadDir = new File(uploadPath); 
     if (!uploadDir.exists()) { 
      uploadDir.mkdir(); 
     } 

     try { 
      @SuppressWarnings("unchecked") 
      List<FileItem> formItems = upload.parseRequest(request); 
      String fileName1 = ""; 
      if (formItems != null && formItems.size() > 0) { 
       for (FileItem item : formItems) { 
        // processes only fields that are not form fields 
        if (!item.isFormField()) { 
         String fileName = new File(item.getName()).getName(); 
         fileName1 += fileName; 
         String filePath = uploadPath + File.separator + fileName; 
         File storeFile = new File(filePath); 
         // saves the file on disk 
         item.write(storeFile); 
        } 
       } 
      } 
      String p_text = request.getParameter("p_data"); 
      String gallery_nm = request.getParameter("upload_wall_gallery"); 
      out.println(p_text); 
      out.println(gallery_nm); 
      //out.println("Upload has been done successfully!"+fileName1); 
     } catch (Exception ex) { 
      out.println(ex.getMessage()); 
     } 

    } 

} 

io in grado di trovare un esempio di lavoro in rete o StackOverflow.

Qualsiasi soluzione semplice?

risposta

22

Il problema è qui:

String p_text = request.getParameter("p_data"); 
String gallery_nm = request.getParameter("upload_wall_gallery"); 

Da How to upload files to server using JSP/Servlet? answer, si dovrebbe ottenere i parametri come FileItem che isFormField() metodi restituisce true. Distacco il frammento di codice corrispondente dalla risposta:

for (FileItem item : formItems) { 
    if (item.isFormField()) { 
     // Process regular form field (input type="text|radio|checkbox|etc", select, etc). 
     String fieldname = item.getFieldName(); 
     String fieldvalue = item.getString(); 
     // ... (do your job here) 
    } else { 
     // Process form file field (input type="file"). 
     String fieldname = item.getFieldName(); 
     String filename = FilenameUtils.getName(item.getName()); 
     InputStream filecontent = item.getInputStream(); 
     // ... (do your job here) 
    } 
} 

Soluzione: spostare gli altri parametri di richiesta di movimentazione alla sezione else quando si chiama if (!item.isFormField()).

for (FileItem item : formItems) { 
    // processes only fields that are not form fields 
    if (!item.isFormField()) { 
     String fileName = new File(item.getName()).getName(); 
     fileName1+=fileName; 
     String filePath = uploadPath + File.separator + fileName; 
     File storeFile = new File(filePath); 
     // saves the file on disk 
     item.write(storeFile); 
    } else { 
     //here... 
     String fieldname = item.getFieldName(); 
     String fieldvalue = item.getString(); 
     if (fieldname.equals("p_data")) { 
      //logic goes here... 
     } else if (fieldname.equals("upload_wall_gallery")) { 
      //next logic goes here... 
     } 
    } 
} 
+0

Grazie, ora funzionante –

+0

@LovepreetSinghBatth da quando sei nuovo qui, contrassegnare questo post come risposta facendo clic sul controllo sotto la reputazione. –

3

Dalla sua forma multipart/form-data una chiamata a request.getParameter() tornerà sempre nullo. In questo caso quello che devi fare è

if (item.isFormField()) { 
    System.out.println("Got a form field: " + item.getFieldName()+ " " +item.getString()); 
} else { 
    // it is a file process, the way you are doing it 
} 

Spero che ogni cosa funzioni bene.

+0

Grazie, ora attivo –

+1

Puoi accettare e votare questa risposta se ha funzionato per te. Aiuterà gli utenti futuri :). – kaysush

Problemi correlati