2010-06-23 1 views
1

J'ai un problème avec le téléchargement en utilisant ce code servlet qui utilise Tomcat NIO and Sendfile:problème avec le téléchargement de gros fichiers via Tomcat NIO et 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()); 

Il Travaillons avec succès avec le fichier abou 20Mb. Mais quand j'essaye de télécharger le dossier avec la taille environ 288Mb je vois le dossier vide. La taille du fichier téléchargé est 0 octet. J'utilise jre6, 6.x tomcat avec NioConnector:

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

Je ne l'ai jamais utilisé auparavant, alors voici juste un tir rapide dans le noir: essayez d'omettre 'response.setContentLength()'. – BalusC

Répondre

0

Et pourquoi prenez la intValue() vous de celui-ci? Vous disposez déjà de 8 chiffres hexadécimaux avec 288 Mo, c'est-à-dire lorsque la taille du fichier devient suffisamment grande pour nécessiter le chiffre suivant, il débordera l'int. Utilisez l'ensemble «long». Mieux encore, ne le spécifiez pas du tout, laissez Tomcat s'en occuper.

Vérifiez également que vous utilisez le mode de transfert en bloc.

Questions connexes