6

Sto provando a scaricare una parte di un file PDF (solo per testare l'intestazione "Range"). Ho richiesto il server per i byte (0-24) in Range ma, invece di ottenere i primi 25 byte (una parte) fuori dal contenuto, ricevo il contenuto a lunghezza intera. Inoltre, invece di ottenere il codice di risposta come 206 (contenuto parziale), mi sto codice di risposta da 200.Download di una parte di un file tramite richieste HTTP

Ecco il mio codice:

public static void main(String a[]) { 
    try { 
     URL url = new URL("http://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-windows-x64.exe?AuthParam=1372502269_599691fc0025a1f2da7723b644f44ece"); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
     urlConnection.connect(); 

     System.out.println("Respnse Code: " + urlConnection.getResponseCode()); 
     System.out.println("Content-Length: " + urlConnection.getContentLengthLong()); 

     InputStream inputStream = urlConnection.getInputStream(); 
     long size = 0; 

     while(inputStream.read() != -1) 
      size++; 

     System.out.println("Downloaded Size: " + size); 

    }catch(MalformedURLException mue) { 
     mue.printStackTrace(); 
    }catch(IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

ecco l'output:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848

Grazie in anticipo.

+0

è possibile verificare che un programma in grado di scaricare le gamme effettivamente scaricare un gamma? (prova ad avviare wget, Ctrl + Cingolo e avviarlo di nuovo) Alcuni server potrebbero rifiutare la richiesta così com'è. – hexafraction

risposta

-1

Penso che l'intestazione corretta sia "Content-Range", non "Range" come si sta utilizzando.

+0

gstack, provato anche con '" Content-Range "'; ottenendo la 'stessa uscita' –

+1

No AFAIK. la gamma di contenuti è ciò che le risposte del server. Range ciò che devi richiedere. – Alex

1

Se il server lo supporta (e i server HTTP 1.1 dovrebbero), solo allora è possibile utilizzare le richieste di intervallo ... e se tutto ciò che si vuole fare è controllare, inviare semplicemente una richiesta HEAD invece di una richiesta GET. Stessi header, stesso tutto, solo "HEAD" invece di "GET". Se ricevi una risposta 206, saprai che Range è supportato e in caso contrario riceverai 200 risposte.

+0

gstack, ho inviato una richiesta "HEAD" e ho ricevuto il codice di risposta come 200. Ciò deve implicare che il server non supporta la funzione di download "Resuming". Quindi, vorrei sapere, come sono in grado di "mettere in pausa" e "riprendere" il download di questo file in altri gestori di download. Inoltre, sarebbe bello se tu potessi suggerire qualsiasi link http la cui porzione di contenuto possa essere scaricata con questo metodo. –

+0

http://marvinlee.wordpress.com/2007/08/08/make-your-own-java-download-manager/ –

8

provare a cambiare seguente:

urlConnection.setRequestProperty("Range", "Bytes=0-24"); 

con:

urlConnection.setRequestProperty("Range", "bytes=0-24"); 

secondo le specifiche 14.35.1 Byte Ranges

Allo stesso modo, secondo le specifiche 14.5 Accept-Ranges, si può anche verificare se il server è in realtà supporti recupero parziale dei contenuti o non utilizzo dei seguenti dati:

boolean support = urlConnection.getHeaderField("Accept-Ranges").equals("bytes"); 
System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No)); 
-1

è necessario collegare a url prima setRequestProperty

Cambio:

urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
urlConnection.connect(); 

A:

urlConnection.connect(); 
urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
Problemi correlati