2009-05-24 2 views
7

Normalmente, quando voglio per consentire a un utente di scaricare un file senza rivelare la posizione esatta, mi basta usare qualcosa di simile per far loro scaricare il file:Come posso consentire a un download di mettere in pausa/riprendere?

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"" . $filename) . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($filename)); 
readfile("$filename"); 

Ma se stanno usando un browser moderno o altri client di download, interrompono il download e provano a riprenderlo, lo script (supponendo che siano ancora autenticati o altro) rimanderà le intestazioni e il contenuto del file fin dall'inizio, interrompendo così il download e in pratica richiedendo che il file sia riscaricato dall'inizio.

Come posso abilitare il mio script a compensare i download in pausa (e conseguentemente, ripresi)?

+0

Avete veramente bisogno di questa funzionalità? I tuoi download protetti vengono dai caricamenti degli utenti? In tal caso, qual è il tuo limite per le dimensioni del caricamento? Se il suo 50 MB o meno, direi che è ok per non avere questa funzionalità. Oppure, se sono tutti i file generati e la dimensione media è ugualmente piccola, probabilmente non è necessaria. D'altra parte, se sono tutti file molto grandi, si potrebbe considerare di fare qualcosa come distribuirli come torrent, quindi proteggere il download del file torrent. Non è sicuro come gli utenti possono quindi condividere file torrent - solo qualcosa su cui riflettere. –

+0

A partire da questo momento, sto chiedendo come solo cercare la conoscenza, non usarla in alcun progetto particolare. Ho voluto questa funzionalità nei progetti passati e probabilmente lo farò in futuro. Ho solo pensato di chiederlo mentre non ho fretta di trovare la risposta. –

risposta

10

Utilizzo di PHP built-in fopen per aprire il file e quindi fseek nel posto giusto (in base all'intervallo nell'intestazione della richiesta) e quindi restituire il file parziale utilizzando fpassthru invece di utilizzare readfile.

Potete trovare qualche esempio di codice in PHP sotto i commenti per fread

+0

Non ho ancora testato quel codice, ma è esattamente quello che stavo cercando, quindi accetto questo come risposta. –

5

È necessario leggere le intestazioni della richiesta come Range, If-Range, ecc. Quindi cercare la posizione corretta nel file. Normalmente un web server lo farebbe per te su un file normale. E 'un po' complessa, ma qui c'è qualcosa che potrebbe iniziare:

http://forums.asp.net/t/1218116.aspx

http://www.notes411.com/dominosource/tips.nsf/0/480C4E3BE825F69D802571BC007D5AC9!opendocument

Per il secondo link il codice è in parte 12

+0

Questi sono entrambi ottimi link ... ma non capisco il codice in questi esempi. Qualche tutorial su PHP o simili che conosci? Google non è al momento al solito suo utile self ... –