Passar parametros via post usando multipart/form-data

7 respostas
dmribeiro

Surgiu um problema:

Quando faço o upload usando o enctype="multipart/form-data" não consigo recuperar nenhum parametro via post na minha servlet.
Se retirar o enctype="multipart/form-data" consigo recuperar os parametros via post na minha servlet mas não consigo fazer o upload.

Já dei uma pesquisada sobre o assunto, porem não consegui resolver meu problema. Alguem ja passou por isso?

teste2.jsp
<title>Form para upload de arquivo</title>
<!--  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">-->
</head> 				 
	<body>
	<form name="teste2" method="post"  action="RecuperaDados" enctype="multipart/form-data" >		
			Arquivo <h3> Upload: </h3>
			Selecione um arquivo para upload:<br>						 
				<input type="file" name="file" id="file"   size="50"><br>
					<input type="text" name="id"  size="5"><br>
					<input type="submit" value="Upload File" >															
		</form>
	</body>

servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
		String id = request.getParameter("id");
		String file = request.getParameter("file");				
        
        request.setAttribute("id", id);   
        request.setAttribute("file", file);            
        
         //despachando a request para a página de destino
        RequestDispatcher dispatcher = request.getRequestDispatcher("/uploadFile.jsp");   
        dispatcher.forward(request, response);	
        
	}

7 Respostas

B

tenta assim

MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);

String id = (String)mrequest.getParameter("id");
Rodrigo_Sasaki

Se não me engano o enctype=“multipart/form-data”, é específico para upload…

se você usar ele, não sei se vai conseguir mandar outras informações pelo mesmo form.

dmribeiro

build_successful , ele não chega nem a enviar os parametros quanto o metodo é post, somente se retirar o multipart/form-data.

Mas via Get funfa belza, to achando que isso é um bug.

leocantanhede

Tive este mesmo problema, terá que usar uma biblioteca para fazer upload e depois utilizá-la para recuperar os valores, recomendo a Apache Commons-FileUpload

novato25

você importou a biblioteca commons-file-upload.jar no seu projeto? se você está utilizando o tomcat, faça o teste colocando também esta biblioteca na pasta lib (no tomcat).

dmribeiro

Já realizei todos estes passos, estou utilizando a biblioteca jackarta, utilizo o apache, já coloquei o jar na pasta lib tbm.

A questão não é o upload, pois este funciona blz, e os paramentros dele eu consigo pegar como podem ver no codigo abaixo. A questão é que preciso passar
algumas informações do formulário principal para servlet e envialas para o uploadFile.jsp

<%@ page import="com.mysql.jdbc.Driver.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="conecta.*" %>
<%@ page import="javax.servlet.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.io.output.*"%>

<%			
	System.out.println("parametros: " + request.getParameter("id") + " " + request.getParameter("file")); 
	
   File file;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   
   ServletContext context = pageContext.getServletContext();  
   String filePath = context.getInitParameter("file-upload"); // pega o parametro do xml(no caso o caminho onde será salvo os arquivos)
  
   //  Verifique se o tipo de conteúdo
   String contentType = request.getContentType();   
   
  // System.out.println("contentType " + contentType.indexOf("multipart/form-data"));
  // System.out.println("contentType " + contentType);
  
   if ((contentType.indexOf("multipart/form-data") >= 0)) { 
		System.out.println("entrou no loop");
	   
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // Tamanho máximo que será armazenado na memória
      factory.setSizeThreshold(maxMemSize);
      // Local para guardar dados que é maior do que maxMemSize.
      factory.setRepository(new File("C:\temp")); 

      // Criar um novo arquivo do manipulador de upload
      ServletFileUpload upload = new ServletFileUpload(factory);
      // Tamanho máximo de arquivo a ser carregado.
      upload.setSizeMax( maxFileSize );
          	
      try{ 
         // Analisar a solicitação para obter itens de arquivo.
         List fileItems = upload.parseRequest(request);
         // Processar os itens de arquivos enviados
         Iterator i = fileItems.iterator();

         out.println("<html>"); 
         out.println("<head>"); 
         out.println("<title>JSP Arquivo upload</title>");  
         out.println("</head>");
         out.println("<body>"); 
         while ( i.hasNext () ) 
         { 
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) 
            { 
            // Pega os parâmetros de arquivos enviados
            String fieldName = fi.getFieldName(); 
            String fileName = fi.getName();
            boolean isInMemory = fi.isInMemory(); 
            long sizeInBytes = fi.getSize(); 
            // Escreve o arquivo
            if( fileName.lastIndexOf("\\") >= 0 ){ 
            	file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ; 
            }else{ 
            	file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\")+1)) ;
            } 
            	fi.write( file ) ; 
           		out.println("Uploaded Filename: " + filePath );
           		System.out.println("file: " + file);
            } 
         } 
     
         out.println("</body>"); 
         out.println("</html>"); 
         
     	 }catch(Exception ex) { 
        	 System.out.println(ex); 
       }
   }else{ 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Arquivo Servlet upload</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<p>Não foi feito upload do arquivo</p>"); 
      out.println("</body>");
      out.println("</html>"); 
   } 
%>
dmribeiro

Para não deixar o post sem resposta venho finaliza-lo, para alguem mais que tiver o mesmo problema segue a solução:

if(fi.isFormField()){ // Apartir deste ponto recupera-se os parametros do formulário         	  
        	   
            	String idd = fi.getString();        	   
            	System.out.println("retorno incerto: " + idd);        	   
           }

Basta apenas acrescentar esta parte no código (no caso deste exemplo o uploadFile.jsp), com ela conseguimos todos os parametros enviados.

Criado 13 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 7
Participantes 5