Проблема с загрузкой больших файлов через Tomcat NIO и Sendfile - PullRequest
1 голос
/ 23 июня 2010

У меня возникли проблемы с загрузкой с использованием этого кода сервлета, в котором используются 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());

Он успешно работает с файлом размером до 20 МБ.Но когда я пытаюсь скачать файл размером около 288 Мб, я вижу пустой файл.Размер загружаемого файла составляет 0 байт.Я использую jre6, Tomcat 6.x с NioConnector:

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

1 Ответ

0 голосов
/ 24 июня 2010

И почему вы берете intValue () этого? Вы уже хорошо разбираетесь в 8 шестнадцатеричных цифрах с 288 МБ, то есть когда размер файла становится достаточно большим, чтобы потребовать следующую цифру, он переполняет int. Используйте весь «длинный». Более того, не указывайте это вообще, пусть Tomcat позаботится об этом.

Также убедитесь, что вы используете режим частичной передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...