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
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…
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.
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.
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
Já se eu passar o nome do arquio somente, ele processa, porém nao faz o upload.
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:
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..."
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…