Nos últimos dias fiz um teste com upload de arquivo usando o jakarta commons.fileupload e constatei que o exemplo que vem com a api e está em vários sites, tem um pequeno esquecimento:
public void doPost(HttpServletRequest req, HttpServletResponse res)
{
DiskFileUpload fu = new DiskFileUpload();
// maximum size before a FileUploadException will be thrown
fu.setSizeMax(1000000);
// maximum size that will be stored in memory
fu.setSizeThreshold(4096);
// the location for saving data that is larger than getSizeThreshold()
fu.setRepositoryPath("/tmp");
List fileItems = fu.parseRequest(req);
// assume we know there are two files. The first file is a small
// text file, the second is unknown and is written to a file on
// the server
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("/www/uploads/" + fileName);
}
Na realidade a linha:
String fileName = fi.getName();
traz, na realidade, o nome do arquivo junto com seu endereço no cliente, p. ex., fileName == /home/user/arquivo.pdf, ao invés de somente arquivo.pdf, isso pode gerar um erro, uma exceção na verdade, por isso quando é executada a linha:
fi.write("/www/uploads/" + fileName);
estaria gravando /www/uploads//home/user/arquivo.pdf, quando o aparentemente certo seria /www/uploads/arquivo.pdf. Bom encontrei uma solução que não sei se é correta, testei-a no tomcat 5.0.28 utilizando o windows 98 com a jvm j2sdk1.4.2_03:
String fileName = fi.getName().substring(fi.getName().lastIndexOf("/"));
para linux e substituindo “/” por “\” para windows, isso funcionou perfeitamente aqui comigo, mas como vi a primeira forma tão mostrada na internet e mesmo na api, gostaria de saber se isso só funciona comigo, vcs poderiam testar o meu código e o da api e ver qual a diferença? Obrigado.