Passar parametros via post usando multipart/form-data

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

[code]Form para upload de arquivo

Arquivo

Upload:

Selecione um arquivo para upload:


[/code]

servlet

[code]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);	
    
}[/code]

tenta assim


MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);

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

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.

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.

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

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).

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

[code]<%@ 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("");
out.println("");
out.println(“Arquivo Servlet upload”);
out.println("");
out.println("");
out.println(“

Não foi feito upload do arquivo

”);
out.println("");
out.println("");
}
%>[/code]

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.