59 votes

Reprendre le téléchargement du fichier http en java

 URL url = new URL("http://download.thinkbroadband.com/20MB.zip");

URLConnection connection = url.openConnection();
File fileThatExists = new File(path); 
OutputStream output = new FileOutputStream(path, true);
connection.setRequestProperty("Range", "bytes=" + fileThatExists.length() + "-");

connection.connect();

int lenghtOfFile = connection.getContentLength();

InputStream input = new BufferedInputStream(url.openStream());
byte data[] = new byte[1024];

long total = 0;

while ((count = input.read(data)) != -1) {
    total += count;

    output.write(data, 0 , count);
}
 

dans ce code, j'essaie de reprendre le téléchargement. Le fichier cible est 20MB. Mais quand j'arrête le téléchargement sur 10mb, puis continue, j'obtiens le fichier avec la taille de fichier 30MB. Il semble qu’elle continue à écrire dans le fichier, mais ne puisse pas télécharger en partie du serveur. Wget -c fonctionne très bien avec ce fichier. Comment puis-je reprendre le téléchargement de fichier?

59voto

POMATu Points 907
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    if(ISSUE_DOWNLOAD_STATUS.intValue()==ECMConstant.ECM_DOWNLOADING){
        File file=new File(DESTINATION_PATH);
        if(file.exists()){
             downloaded = (int) file.length();
             connection.setRequestProperty("Range", "bytes="+(file.length())+"-");
        }
    }else{
        connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
    }
    connection.setDoInput(true);
    connection.setDoOutput(true);
    progressBar.setMax(connection.getContentLength());
     in = new BufferedInputStream(connection.getInputStream());
     fos=(downloaded==0)? new FileOutputStream(DESTINATION_PATH): new FileOutputStream(DESTINATION_PATH,true);
     bout = new BufferedOutputStream(fos, 1024);
    byte[] data = new byte[1024];
    int x = 0;
    while ((x = in.read(data, 0, 1024)) >= 0) {
        bout.write(data, 0, x);
         downloaded += x;
         progressBar.setProgress(downloaded);
    }
 

Ce n'est pas mon code, mais ça marche.

17voto

user1084090 Points 159

J'imagine que le problème que vous rencontrez est d'appeler url.openStream() après url.openConnection() .

url.openStream() équivaut à url.openConnection().getInputStream() . Par conséquent, vous demandez l'URL deux fois. Particulièrement la deuxième fois, il ne s'agit pas de spécifier la propriété de plage. Par conséquent, le téléchargement commence toujours au début.

Vous devriez remplacer url.openStream() par connection.getInputStream() .

3voto

Mark Fisher Points 2575

Découvrez ce fil qui a un problème similaire au vôtre . Si wget fonctionne, le serveur prend clairement en charge la reprise des téléchargements. Il semble que vous ne définissiez pas l'en-tête If-Range comme indiqué dans la réponse acceptée du lien ci-dessus. c'est à dire. ajouter:

 // Initial download.
String lastModified = connection.getHeaderField("Last-Modified");

// ...

// Resume download.
connection.setRequestProperty("If-Range", lastModified); 
 

1voto

koljaTM Points 3892

Depuis que la question est étiquetée avec Android: Avez-vous essayé d'utiliser DownloadManager . Il gère tout ça pour toi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X