Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

FQueiros

Download files

Mensagens Recomendadas

FQueiros    5
FQueiros

Bom dia,

Eu tenho uma aplicação web e nela criei uma servlet simples, só com uma função para fazer o dowload de um ficheiro e fazer o stream dos dados para o cliente através do output da resposta.

O problema é o seguinte, quando eu tento executar esta servlet num browser desktop funciona bem sem erros, consigo fazer o download do ficheiro ou renderiza-lo no browser.

Mas quando eu tento aceder à servlet por exemplo no browser de um tablet android devolve-me a seguinte exceção:

java.net.SocketException: Connection reset by peer: socket write error
java.net.SocketOutputStream.socketWrite(Native Method)
java.net.SocketOutputStream.write(SocketOutputStream.java(Compiled Code))
com.ibm.ws.io.Stream.write(Stream.java(Compiled Code))
com.ibm.ws.io.WriteStream.flushMyBuf(WriteStream.java(Inlined Compiled Code))
com.ibm.ws.io.WriteStream.flush(WriteStream.java(Inlined Compiled Code))
com.ibm.ws.http.ResponseStream.flush(ResponseStream.java(Compiled Code))
com.ibm.ws.io.WriteStream.flush(WriteStream.java(Compiled Code))
com.ibm.ws.webcontainer.http.HttpConnection.flush(HttpConnection.java(Inlined Compiled Code))
com.ibm.ws.webcontainer.srp.SRPConnection.flush(SRPConnection.java(Compiled Code))
com.ibm.ws.webcontainer.srt.SRTOutputStream.flush(SRTOutputStream.java(Compiled Code))
com.ibm.ws.webcontainer.srt.BufferedServletOutputStream.flushBytes(BufferedServletOutputStream.java(Compiled Code))
com.ibm.ws.webcontainer.srt.BufferedServletOutputStream.write(BufferedServletOutputStream.java(Compiled Code))
java.io.BufferedOutputStream.write(BufferedOutputStream.java(Compiled Code))
mynet.presentation.servlets.TestesVD.sendFile(TestesVD.java:765)
mynet.presentation.servlets.TestesVD.doGet(TestesVD.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code))
javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code))
com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(Compiled Code))
com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(Inlined Compiled Code))
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code))
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java(Compiled Code))
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code))
com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code))
com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code))
com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code))
com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code))
com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code))
com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code))
com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code))
com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code))
com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code))
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))

Código para download do ficheiro:

private void sendFile(String filePathName, HttpServletResponse response, boolean forceSave) {


String disposition = forceSave ? "attachment" : "inline";
 OutputStream out = null;
 BufferedInputStream fileInput=null;
 try{
	 File dataFile=new File(filePathName);

	 if(!dataFile.exists( )){
	 filePathName = new String( filePathName.getBytes("ISO-8859-1"), "UTF-8");
	 dataFile = new File(filePathName);
	 }

	 fileInput=new BufferedInputStream(new FileInputStream(dataFile));

	 //long fileSize=dataFile.length(); Obtenção do tamanho do ficheiro
	 if( fileInput != null ) {
		 out = new BufferedOutputStream(response.getOutputStream());

		 String contentType = getServletConfig().getServletContext().getMimeType( filePathName );
		 if( contentType == null ){
			 contentType = "application/unknown";
		 }
		 System.out.println("disposition: "+disposition+" contentType: "+contentType+" out: "+out);
		 response.setHeader("Content-Disposition", disposition + "; filename=\"" + dataFile.getName() + "\"");
		 response.setContentType(contentType);
		 System.out.println("Vai escrever out: "+out);


 final byte data[] = new byte[1024];
		 int c;
		 /*while(( c = fileInput.read() ) != -1){ //Escreve do buffer de entrada (fonte) para o buffer que vai conter o ficheiro (destino)
		 System.out.println(c);
		 out.write( c );
		 }*/
		 while ((c = fileInput.read(data, 0, 1024)) != -1) {
		 System.out.println(c);
			 out.write(data, 0, c);
		 }



	 }


 }catch (FileNotFoundException e) {
 e.printStackTrace();
	 System.err.println("Erro ao enviar ficheiro:"+filePathName+"." );

 }catch (Exception e0) {
 e0.printStackTrace();
	 System.err.println("Erro ao enviar ficheiro:"+filePathName+". " + e0.getLocalizedMessage());

 }

 if(fileInput != null){
	 try {
	 fileInput.close();
	 System.out.println("fecha o input");
	 }catch( Exception e1 ) {
	 System.out.println("Erro ao fechar o input");
	 MyNetLog.sendErro("-> ERROR:Ocorreu uma exepção ao fechar o objeto fonte "+e1.getLocalizedMessage());
	 }
 }
 if(out != null){
	 try {
	 System.out.println("fecha o output");
	 out.close();

	 } catch( Exception e2 ) {
	 System.out.println("Erro ao fechar o output");
	 e2.printStackTrace();
	 //MyNetLog.sendErro("-> ERROR:Ocorreu uma exepção ao fechar o objeto destino "+e2.getLocalizedMessage());
	 }
 }

}

Obrigado.

Filipe Queirós

Editado por apocsantos
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.