Olá estou tentando fazer um upload de arquivo usando jakarta Commons FileUpload 1.2. Já adicionei esse pacote dentro de WEB-INF/lib porém dá um erro que não consigo explicar.
Primeira vez que posto no GUJ espero ser bem recebido 
Vamos aos códigos
[code]import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(4096);
// the location for saving data that is larger than getSizeThreshold()
factory.setRepository(new File("/tmp"));
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum size before a FileUploadException will be thrown
upload.setSizeMax(1000000);
List fileItems;
try
{
fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
String comment = ((FileItem)i.next()).getString();
FileItem fi = (FileItem)i.next();
// filename on the client
String fileName = fi.getName();
// save comment and filename to database
// write the file
fi.write(new File("/data/", fileName));
} catch (FileUploadException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
[/code]
O jsp que envia para esse servlet é:
<form action="/upload" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>Selecione uma imagem para fazer o upload: <input type="file" name="filename"> <input type="submit" value="upload"></td>
</tr>
</table>
</form>
o erro que acontece é esse
SEVERE: Servlet.service() for servlet UploadServlet threw exception
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
exatamente quando ele tenta executar
fileItems = upload.parseRequest(request);
Quando ocrre erro de NoClassDefFoundError, é pq a classe não foi encontrada, então, verifica se a sua classpath está configurada corretamente e se vc adicionou os jars corretamente na sua aplicação.
Exatamente verifique se esses jars estão no seu classpath:
commons-fileupload-1.2.jar
commons-io-1.3.1.jar
Eu coloquei no WEB-INF/lib pensei que resolvesse…
colocar no meu classpath o .jar seria coloca-lo aqui?
C:\Arquivos de programas\Java\jre1.5.0_08\lib
eu não tenho esse commons-io
vou precisar dele???
Adicionei o meu . jar em variáveis de sistema, mas o mesmo erro continua acontecendo
CLASSPATH=.;%CLASSPATH%;C:\Arquivos de programas\Java\jre1.5.0_08\lib\commons-fileupload-1.2.jar
se alguém puder me dar uma ajuda em como eu coloco esse jar para ele reconhecer no classpath por favor me fale
Vai precisar sim, faça o download aqui:
apenas dentro do WEB-INF/lib deve resolver.
Se você já colocou, verifique se a exception é a mesma
Caso não resolva colocar o JAR na WEB-INF/lib , coloque tbm na commons/lib
Pedrosa muito obrigado. Realmente estava faltando esse outro .jar.
Coloquei os dois jar’s no WEB-INF/lib e funcionou, porém aquela classe que usei não deu certo. Vou postar o meu servlet atual que achei na internet que está funcionando corretamente.
Porém há duas falhas nele.
Uma que o getServletContext().getRealPath("/data/");
retorna esse caminho C:\Documents and Settings\Juan Carlos\Desktop\Juan\eclipse_Lomboz\Meus Projetos.metadata.plugins\org.eclipse.wst.server.core\tmp0\webapps\Nova_OJK\data
quando eu queria que retornasse esse
C:\Documents and Settings\Juan Carlos\Desktop\Juan\eclipse_Lomboz\Meus Projetos\Nova_OJK\WebContent\data
estranho não?
segundo que o arquivo que eu fiz o upload só fica visível no sistemas quando eu dou um f5. Queria pegar esse arquivo e adiciona-lo em um rich text editor, mas só fica um X. Apesar da imagem realmente constar lá.
Quem puder me ajudar com alguma dessas outras 2 dúvidas eu agradeço.
<form action="/Nova_OJK/tentativa" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>Selecione uma imagem para fazer o upload:
<input name="imagem" type="file" accept="image/jpeg; image/gif; image/bmp; image/png" id="imagem" class="dados" tabindex="1">
<input type="submit" value="upload">
</td>
</tr>
</table>
</form>
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet3 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String formulario = "";
try
{
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext())
{
FileItem item = (FileItem) iter.next();
if (item.getFieldName().equals("tipoForm"))
{
formulario = item.getString();
}
if (!item.isFormField())
{
if (item.getName().length() > 0)
{
this.inserirImagemDiretorio(item);
}
}
}
}
catch (FileUploadException ex)
{
ex.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private void inserirImagemDiretorio(FileItem item) throws IOException
{
//FIXME Estou colocando o caminho completo que não é aconselhável, consertar para pegar de acordo com o projeto
// getServletContext().getRealPath("/");
String caminho = "C:\\Documents and Settings\\Juan Carlos\\Desktop\\Juan\\eclipse_Lomboz\\Meus Projetos\\Nova_OJK\\WebContent\\data";
// Cria o diretório caso ele não exista
File diretorio = new File(caminho);
if (!diretorio.exists())
{
diretorio.mkdir();
}
// Mandar o arquivo para o diretório informado
String nome = item.getName();
String arq[] = nome.split("\\\\");
for (int i = 0; i < arq.length; i++)
{
nome = arq[i];
}
File file = new File(diretorio, nome);
FileOutputStream output = new FileOutputStream(file);
InputStream is = item.getInputStream();
byte[] buffer = new byte[2048];
int nLidos;
while ((nLidos = is.read(buffer)) >= 0)
{
output.write(buffer, 0, nLidos);
}
output.flush();
output.close();
}
}
O que ocorreu desta vez é que você está rodando dentro do Eclipse, correto?
Faça um WAR file e depois o deploy em seu servidor.
[]'s