我使用这个使用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" />
答案 0 :(得分:0)
你为什么要使用它的intValue()?你已经很好地用8个十六进制数字和288 MB,即当文件大小足够大以至于需要下一个数字时,它将溢出int。使用整个'长'。更好的是,不要指定它,让Tomcat来处理它。
还要确保使用分块传输模式。