Upload no Internet Explorer

17 respostas
Aganiuipuque

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!!!

17 Respostas

cv1

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…

Aganiuipuque

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?

cv1

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.

fzampa

cv:

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

Como assim?

cv1

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.

Aganiuipuque

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??

cv1

Gere um nome aleatorio pro arquivo, ueh :slight_smile:

Aganiuipuque

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???

cv1

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

Veja como o flickr faz isso :wink:

Aganiuipuque

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)
cv1

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:

E

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.

Aganiuipuque

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…

Aganiuipuque

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:

Aganiuipuque

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  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ão há nada que supere a perseverança..."

Agradeço aqueles que tentaram me ajudar…

Aganiuipuque

Valeu galera!!

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

heheheheh!!!

iSoron

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.

Criado 31 de janeiro de 2005
Ultima resposta 7 de fev. de 2005
Respostas 17
Participantes 5