FileDownloader iOS

I’m downloading a file with FileDownloader from a database:

[code]
table.addGeneratedColumn(columnDownload, new ColumnGenerator() {
public Object generateCell(Table source, final Object itemId, Object columnId) {
final Button download = new Button();
download.setIcon(new ThemeResource(“Download.png”));

            StreamResource resource = downloadFile(itemId.toString());
            if (resource != null) {
            	final FileDownloader fileDownloader = new FileDownloader(resource);
    			fileDownloader.extend(download);
            }        		
	        return download;
	    }
	});	

[/code]It works with all browsers except of the iOS browser (iPad). I get this error:

31.07.2013 09:18:14 com.vaadin.server.DefaultErrorHandler doDefault
SEVERE:
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:406)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:371)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:431)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:419)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
at com.vaadin.server.DownloadStream.writeResponse(DownloadStream.java:300)
at com.vaadin.server.FileDownloader.handleConnectorRequest(FileDownloader.java:148)
at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:71)
at com.vaadin.server.AbstractCommunicationManager.handleOtherRequest(AbstractCommunicationManager.java:2344)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:330)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:201)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119)
at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
at org.apache.coyote.Response.doWrite(Response.java:505)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:401)
… 27 more

Unfortunately, the log file gives me no more information about the error.
What can I do?

Hey :slight_smile:

Sry but i just can’t resist. The Exception sounds like the browser is actually closing the connection before the entire file reached the client. Whether this comes from a big File or the Browser being bugged or just set up to block File Transfers like this. The FileDownloader-Extension uses an IFrame in which a stream is embedded with content-dispostion=attachment. Maybe this is not properly supported by the ios Version you’re using.
You could try to…:[list]

[]
…extend the FileDownloader-Extension to use inline instead of attachment
[
]
…replace your Button+FileDownloader with a Link Component which is opening the dynamic Resource (with MIMEType=application/octet-stream)
[*]
…test if the deprecated way of opening a Resource still works.

[/list]Maybe the Problem is resolved in a later version of the ios Operating System.

Hope I could help you. :wink:

Also make sure there is no proxy/firewall/content inspection server that might block some transfers.