2010-06-23 81 views
1

下载大文件,我有一些问题,使用该servlet代码这使得Tomcat NIO and Sendfile使用下载:问题通过的Tomcat NIO和SENDFILE

long fileSize = file.length(); 
    long startAt = 0; 
    if (request.getHeader("Range") != null) { 
     response.setStatus(206); 
     startAt = Long.parseLong(request.getHeader("Range").replaceAll("bytes=", "").split("-")[0]); 
    } 

    long dataToWrite = fileSize; 
    if (startAt > 0) {   
     response.setHeader("Content-Range", String.format("bytes - %d-%d/%d", startAt, fileSize - 1, fileSize)); 
     dataToWrite = fileSize - startAt; 
    } 
request.setAttribute("org.apache.tomcat.sendfile.filename", file.getCanonicalPath()); 
    request.setAttribute("org.apache.tomcat.sendfile.start", startAt); 
    request.setAttribute("org.apache.tomcat.sendfile.end", fileSize); 
    response.setContentLength(Long.valueOf(dataToWrite).intValue()); 

它成功地与文件安博20MB的工作。但是当我试图下载大小约288Mb的文件时,我看到空文件。下载文件的大小是0字节。 我用JRE6,Tomcat的6.x的与NioConnector:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
      connectionTimeout="20000" 
      redirectPort="8443" useSendfile="true" /> 
+0

我从来没有用过它,所以这里只是在黑暗中快速拍摄:尝试省略'response.setContentLength()'。 – BalusC 2010-06-23 13:37:24

回答

0

为什么你要带它的的intValue()?你已经有8位十六进制数字,288 MB,即当文件大小足够大到需要下一个数字时,它会溢出整数。使用整个'长'。更好的是,不要指定它,让Tomcat照顾它。

此外请确保您使用分块传输模式。