Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: Riprendere download

  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Riprendere download

    Seguendo questo esempio sto realizzando un piccolo download manager in java. Ho un problema pero': se chiudo e riapro il programma la coda di download va persa. Ho provato a serializzare i vari oggetti "Download" ma riaprendo il programma ottengo un stream error... Come posso risolvere?

    Grazie

  2. #2
    in teoria dovresti salvarti il valore della variabile ai byte scaricati, che nel tuo caso sembra essere "downloaded", se non sbaglio.

    codice:
    // Specify what portion of file to download.
                connection.setRequestProperty("Range",
                        "bytes=" + downloaded + "-");

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da sicenti
    in teoria dovresti salvarti il valore della variabile ai byte scaricati, che nel tuo caso sembra essere "downloaded", se non sbaglio.

    codice:
    // Specify what portion of file to download.
                connection.setRequestProperty("Range",
                        "bytes=" + downloaded + "-");
    Grazie 1000, mi sono perso in una stupidata ^^' Sono riuscito a far riprendere correttamente il download anche dopo aver chiuso/riaperto il programma.
    Ora ho un'altro problema: tutto cio' che scarico in questo modo mi da problemi (cioe' e' un file danneggiato)! Facendo un po' di prove e controlli ho scoperto che (nel caso chiudo e riapro il download) il totale di byte scaricati e' maggiore rispetto alla dimensione del file:

    codice:
    <root>
      <download>
        <url>http://img412.imageshack.us/img412/1803/0041hx2vf4.gif</url>
        <downloaded>42048</downloaded>
        <size>41024</size>
      </download>
    </root>
    (questo e' il file che mi tiene conto dei download lasciati in sospeso)

    Perche' succede questo? Cosa ho sbagliato questa volta?
    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Facendo qualche altra prova sembra che che al momento della pausa si perda qualche byte (o me li scarica 2 volte)... Non capisco come mai pero'! Se stoppo e faccio ripartire (senza uscire) tutto ok, se stoppo, esco, rietro e faccio ripartire al termine del download mi trovo un file danneggiato!

    Ho notato poi che un download senza la chiusura del programma termina quando stream.read(buffer) mi restituisce -1 mentre un download ripreso dopo la chiusura del programma non mi restituisce mai -1 ma alla fine restituisce per qualche ciclo 0 e poi supera la dimensione di partenza... boh

  5. #5
    hai considerato che alcuni server non permettono il resume dei file in download?

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da sicenti
    hai considerato che alcuni server non permettono il resume dei file in download?
    Non e' per questo, il download lo posso stoppare e far partire tutte le volte che voglio e non mi da problemi. Il problema c'e' quando stoppo, chiudo, riavvio il programma e faccio il resume

  7. #7
    probabilmente c'è un problema con il file che ottieni, prova a postare il codice del run()

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da sicenti
    probabilmente c'è un problema con il file che ottieni, prova a postare il codice del run()
    Allora, questo e' il run:

    codice:
    public void run()
        {
            RandomAccessFile file = null;
            InputStream stream = null;
    
            try
            {
                // Open connection to URL.
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
                // Specify what portion of file to download.
                connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
    
                // Connect to server.
                connection.connect();
    
                // Make sure response code is in the 200 range.
                if (connection.getResponseCode() / 100 != 2)
                {
                    error();
                }
    
                // Check for valid content length.
                int contentLength = connection.getContentLength();
    
                if (contentLength < 1)
                {
                    error();
                }
    
                // Set the size for this download if it hasn't been already set. 
                if (size == -1)
                {
                    size = contentLength;
                    stateChanged();
                }
    
                // Open file and seek to the end of it.
                file = new RandomAccessFile(getFileName(url), "rw");
                file.seek(downloaded);
    
                stream = connection.getInputStream();
                
                while (status == DOWNLOADING)
                {
                    /* Size buffer according to how much of the file is left to download. */
                    byte buffer[];
    
                    if (size - downloaded > MAX_BUFFER_SIZE)
                    {
                        buffer = new byte[MAX_BUFFER_SIZE];
                    }
                    else
                    {
                        buffer = new byte[size - downloaded];
                    }
    
                    // Read from server into buffer.
                    int read = stream.read(buffer);
    
                    if (read == -1)
                    {
                        break;
                    }
    
                    // Write buffer to file.
                    file.write(buffer, 0, read);
                    downloaded += read;
                    stateChanged();
                }
    
                /* Change status to complete if this point was
                reached because downloading has finished. */
                if (status == DOWNLOADING)
                {
                    status = COMPLETE;
                    stateChanged();
                }
            }
            catch (Exception e)
            {
                error();
            }
            finally
            {
                // Close file.
                if (file != null)
                {
                    try
                    {
                        file.close();
                    }
                    catch (Exception e)
                    {
                    }
                }
    
                // Close connection to server.
                if (stream != null)
                {
                    try
                    {
                        stream.close();
                    }
                    catch (Exception e)
                    {
                    }
                }
            }
        }
    Viene chiamato sia quando il download inizia da zero che quando riparte (per questo salvo il punto in cui sono arrivato su file xml).

    Questo invece e' il costruttore usato quando carico i dati dal file xml (per sapere dove sono arrivato):

    codice:
        public Download(URL url, int downloaded, int size)
        {
            this.url = url;
            this.downloaded = downloaded;
    
            this.size = size;
            status = DOWNLOADING;
    
            // Begin the download.
            download(); // crea e fa partire il thread per il download
        }
    Non riesco proprio a capire cosa c'e' che non va

    Intanto grazie

  9. #9
    la variabile size è settata correttamente: inizi e riprendi il download con -1?

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da sicenti
    la variabile size è settata correttamente: inizi e riprendi il download con -1?
    Ehm... no, riprendeva da dove era arrivato
    L'ho inizializzata a -1 ma da lo stesso problema

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.