Jump to content

Download files


FQueiros
 Share

Recommended Posts

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

Edited by apocsantos
geshi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.