Upload usando o jakarta commons.fileupload aviso importante!

1 resposta
C

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.

1 Resposta

L

Olá amigo,
quando vc vai fazer o upload na sua própria máquina, ou seja, transferir de um lugar pra outro, ou apenas testar o código, é usado “\” agora qd vc vai colocar no servidor vc utiliza “/” outro jeito que tem para vc tirar todo o caminho seria

String filepath = s.substring(pos+13, s.length() - 1);

isso ser vc já souber qtos caracteres tem, por exemplo se vc for fazer upload toda vez de algum arquivo no diretório C:\ aí vc usar esse exemplo aí.

Falou

Criado 16 de janeiro de 2005
Ultima resposta 17 de jan. de 2005
Respostas 1
Participantes 2