2010-06-23 61 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照顧它。

此外請確保您使用分塊傳輸模式。