通过Tomcat NIO和Sendfile下载大文件的问题

时间:2010-06-23 07:16:47

标签: java tomcat

我使用这个使用Tomcat NIO and Sendfile

的servlet代码下载时遇到了一些问题
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());

它已成功使用文件abou 20Mb。但是,当我尝试下载大小约为288Mb的文件时,我看到空文件。下载文件的大小为0字节。 我使用jre6,tomcat 6.x和NioConnector:

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

1 个答案:

答案 0 :(得分:0)

你为什么要使用它的intValue()?你已经很好地用8个十六进制数字和288 MB,即当文件大小足够大以至于需要下一个数字时,它将溢出int。使用整个'长'。更好的是,不要指定它,让Tomcat来处理它。

还要确保使用分块传输模式。