2009-05-24 14 views
7

Normalmente, cuando quiero permitir que un usuario descargue un archivo sin revelar la ubicación exacta, sólo tiene que utilizar algo como esto para hacerles descarga el archivo:¿Cómo puedo permitir que una descarga se detenga/reanude?

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"); 

Pero si están utilizando un navegador moderno o otro cliente de descarga, pausan la descarga e intentan reanudarla; el script (suponiendo que sigan autenticados o lo que sea) volverá a enviar los encabezados y el contenido del archivo desde el principio, interrumpiendo así la descarga y básicamente requiriendo que el archivo sea redownloaded desde el principio.

¿Cómo puedo habilitar mi script para compensar las descargas pausadas (y consecuentemente, reanudadas)?

+0

lo que realmente necesita esta funcionalidad? ¿Sus descargas protegidas provienen de cargas de usuarios? Si es así, ¿cuál es su límite de tamaño de carga? Si es de 50 MB o menos, diría que está bien no tener esta funcionalidad. O bien, si son todos los archivos que genera y el tamaño promedio es igualmente pequeño, probablemente no sea necesario. Por otro lado, si son todos archivos muy grandes, podría considerar hacer algo así como distribuirlos como un torrente y luego proteger la descarga del archivo torrent. No es tan seguro como los usuarios pueden compartir archivos torrent, simplemente algo en lo que pensar. –

+0

A partir de este momento en el tiempo, estoy preguntando cómo solo buscar el conocimiento, no usarlo en ningún proyecto en particular. He querido esta funcionalidad en proyectos anteriores, y probablemente en el futuro. Solo pensé en preguntar mientras no tengo prisa por encontrar la respuesta. –

Respuesta

10

Uso de PHP integrado fopen para abrir el archivo y luego fseek al lugar correcto (basado en el rango en el encabezado de la solicitud) y luego devuelva el archivo parcial usando fpassthru en lugar de usar readfile.

puede encontrar un código de ejemplo en PHP bajo los comentarios de fread

+0

Todavía no he probado ese código, pero es exactamente lo que estaba buscando, así que estoy aceptando esto como la respuesta. –

5

Necesita leer los encabezados de solicitud como Rango, Rango If, etc. luego busque la ubicación correcta en el archivo. Normalmente, un servidor web haría esto por usted en un archivo ordinario. Es un poco complejo, pero aquí hay algo que puede empezar:

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

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

para el segundo enlace el código está en la parte 12

+0

Esos son excelentes enlaces ... pero no entiendo el código en esos ejemplos. ¿Algún tutorial centrado en PHP o similar que conozcas? Actualmente Google no está siendo de su ayuda ... –

Cuestiones relacionadas