Upload no Internet Explorer

Galera,

escrevi um programa para enviar uploads utlizando o commons-fileupload.
O problema é que ao fazer upload com Internet Explorer o nome do arquivo fica junto com o caminho, por exemplo:

ao fazer upload do arquivo figura.jpg , o arquivo é enviado como

c:/Documents and Settings/figuras/figura.jpg

No Mozilla Firefox este problema não ocorre…

Alguém pode dar uma luz de como resolver isto???

Valeu!!!

Eu entendi o que acontece, mas nao entendi pq isso eh um problema… voce nao deveria usar o nome do arquivo que o browser manda pra nada alem de “curiosidade”, e usar um nome gerado pelo proprio servidor para guarda-lo…

Ola cv!

Cara… não entendi sua colocação…

eu quero apenas o nome do arquivo e não o caminho completo, entendeu?

O sistema está gravando o nome do arquivo junto com o caminho…

sacou?

Sim, pq o nome que o browser manda eh soh uma indicacao. Se voce quiser pegar so o nome do arquivo, quebre a String em / e , e pegue o ultimo pedaco.

Voce nao deve, no entanto, armazenar um arquivo no servidor com esse nome, pq isso abre um buraco de seguranca beeeeeeeeem grande.

[quote=cv]
Voce nao deve, no entanto, armazenar um arquivo no servidor com esse nome, pq isso abre um buraco de seguranca beeeeeeeeem grande.[/quote]

Como assim?

Voce esta armazenando uma string enviada no cliente como um nome de arquivo. Se o cara souber passar um nome de arquivo malandro, ele pode, teoricamente, sobrescrever um arquivo da sua aplicacao, ou do sistema operacional.

Entao gelera!

Consegui resolver o problema utilzando substring, mas existe um problema de incompatibilidade de navegadores.

No IE eu consigo faze-lo utilizando substring, porém no Firefox, Opera, Netscape (que é mesma coisa do firefox), eu preciso “arrancar” o substring.

no exemplo no jakarta, na linha arquivo.getNome() funciona nos demais.
somente no IE esta sendo necessario o uso do substring…

Que merda de navegador!!!

Alguém tem alguma solucao inteligente pra isto???

Ou terei mesmo que identificar qual é o navegador??

Gere um nome aleatorio pro arquivo, ueh :slight_smile:

Boa cv!!

Mas acho que não vai rolar assim…
A galera quer ver depois pelo navegador e nao vai saber qual é o nome da foto…

Mas gostei da alternativa!!!

:lol:

Alguém sugere algo melhor???

Da a URL da foto de volta pro cara ue :slight_smile:

Veja como o flickr faz isso :wink:

Blz… as ideias são boas!

Mas o meu problema é o seguinte:
No MOzilla/firefox funciona perfeitamente, porém no IE gera uma exception
Não teria como fazer isto funcionar em ambos???

Tem como identificar qual é o navegador o usuário? Se tiver eu posso estipular um condicão…Mas não vale JavaScript!!

Se for IE eu uso substring para pegar somente o nome do arquivo, se for Mozilla apenas usarei o arquivo.getName();

Ninguém aqui tentou usar o exemplo de upload do Jakarta commons em ambos os navegadores?? DÁ PAU!! só funciona no Mozilla!!

Veja a o erro que é mostrado no IE:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:289)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:240)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
at java.lang.Thread.run(Thread.java:534)

root cause

java.lang.NullPointerException
at org.apache.commons.fileupload.DefaultFileItem.write(DefaultFileItem.java:442)
at org.apache.jsp.FileUpload_jsp._jspService(FileUpload_jsp.java:88)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:136)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:289)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:240)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
at java.lang.Thread.run(Thread.java:534)

Seu buraco eh um pouco mais embaixo (hehe): voce esta passando null de bobeira em algum lugar. Cheque de novo o seu codigo pra ter certeza de que vc esta passando um nome de arquivo valido. :wink:

Ao invés de utilizar subString utilize File.separator, como no exemplo:

    public static String DIR_UPLOAD = "upload" + File.separator;
   public static String DIR_UPLOAD_EMPRESSA = "upload" + File.separator + "empresa" + File.separator;

Acredito que assim não terá problemas.

Quanto ao FileSparator vou testar…

agora que eu não estou passando nada null isto eu garanto!!!

NAO ESTOU PASSANDO NADA NULL…

Ja depurei todo o codigo…

Bem… voltando ao assunto…

Me disseram que eu estava passando valor NULL e realmente nao estou passando. O que ocorre é que por algum motivo, o IE não esta considerando o arquivo quando é passado da seguinte forma:

c:\meusdomentos\fotos.jpg

Assim ele nao reconhece e o java me retorna NULL POINTER :cry:

Já se eu passar o nome do arquio somente, ele processa, porém nao faz o upload. :cry:

ALGUÉM AQUI UTILIZOU O EXEMPLO DO JAKARTA COMMONS UPLOAD??? :roll:

Como fizeram para funcionar em ambos os navegadores?? (IE e MOZILLA) :?:

Estou aguardando alguma alma generosa me dizer como se faz isto…
estou ficando frustrado… :shock:

Então galera,

Vou contribuir com a comunidade já que ninguém conseguiu me dar a solução, blz?

Agora está funcionado em ambos os navegadores e eu nem precisei utilizar substring!!!

Taí um trecho do meu codigo :

            //Cria-se uma nova instancia de arquivo.
            //O nome é o item.getName() 
             File  nome=new File(item.getName());

             out.println("nome do arquivo:"+nome+"<br>");

     
            /*Aqui eu criei uma instancia só pra pegar o diretorio onde será                   
            */ armazenada a figura  
          
             File dir = new File(pasta);

           /*Agora basta gravar o arquivo passando como parametro a 
             pasta e também o nome do arquivo.
             perceba que eu pequei o objeto NOME e utilizei novamente o
          */ metodo get.Nome();

             item.write(new File(pasta,nome.getName()));
           

           // out.println("salvo em: "+pasta+nome.getName());


             Fácil né????
            


            "... Não há nada que supere a perseverança..."

Agradeço aqueles que tentaram me ajudar…

Valeu galera!!

Já encontrei a solução.
Agora funciona perfeitamente em ambos os navegadores!!

heheheheh!!!

Eu também sou a favor dos nomes “aleatórios”.
Nome de arquivo deve ser manuseado pelo servidor. O usuário deve ver a descriçao da foto, ou a data, no máximo.
Pra eliminar as sombras de duvidas, faz um thumbnail também.

Depender do browser pra saber o nome do arquivo não me parece uma boa ideia.
Mas você quem sabe…

[]'s
iSoron.