Tenho um form com campos texto e 1 do tipo file. Quando meu form tem o código: enctype=“multipart/form-data”, o arquivo passa tranquilo, mas é como se eu deixasse todos os campos vazios. Quando eu retiro este código os campos vão normalmente, porém o arquivo nao vai.
Como posso resolver essa questão?
Desde já agradeço.
Já ouviu falar no ServetFileUpload?
Procura na página da Jakarta. Dentro do projeto Commons
continua usando o enctype
Um exemplo
/*
* FileUploadServlet.java
*
* Created on 16 de Julho de 2006, 19:26
*/
import java.io.*;
import java.net.*;
import java.util.Iterator;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
*
* @author Rafael
* @version
*/
public class FileUploadServlet extends HttpServlet {
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
private ServletContext context;
public void init(ServletConfig config) throws ServletException {
context = config.getServletContext();
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
/* TODO output your page here
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet FileUploadServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet FileUploadServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
*/
out.close();
}
// <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
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//processRequest(request, response);
request.getRequestDispatcher("./upload.jsp").forward(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//processRequest(request, response);
boolean isMultipart = FileUpload.isMultipartContent(request);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(-1);
//factory.setRepository(new File("//Arquivos/"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(-1);
try {
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while(iterator.hasNext()) {
FileItem arquivo = (FileItem) iterator.next();
if (arquivo.isFormField()) {
manipulaFormulario(arquivo, request);
}
else {
manipulaArquivo(arquivo, context);
}
}
} catch (FileUploadException ex) {
ex.printStackTrace();
System.err.println("Erro ao enviar o arquivo");
}
}
}
public void manipulaFormulario(FileItem file, HttpServletRequest request) {
String nomeCampo = file.getName();
String valorCampo = file.getString();
}
public void manipulaArquivo(FileItem file, ServletContext context) {
File caminho = new File(context.getRealPath("//Arquivos"));
String nome = file.getName();
String[] arq = nome.split("////");
nome = arq[arq.length - 1];
File arquiv = new File(caminho, nome);
try {
file.write(arquiv);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
O problema é que você perde o request.getParameter(“campo”).
Você tem que usar
String nomeCampo = file.getName();
String valorCampo = file.getString();
E ir fazendo if pra bater com os nomes do campo do formulario
Não esquece que se for usar, tem que pegar também o commons-io pra funcionar
Espero ter ajudado!!!
Valeu!!!