Foros del Web » Programando para Internet » PHP »

Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto....

Estas en el tema de Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto.... en el foro de PHP en Foros del Web. Aqui teneis la funcion (funciona muy bien en lo que se refiere a limitar la velocidad a 50 kb/s... pero una vez descargado intento extraer ...
  #1 (permalink)  
Antiguo 20/08/2007, 10:40
 
Fecha de Ingreso: marzo-2006
Mensajes: 342
Antigüedad: 18 años, 1 mes
Puntos: 0
Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto....

Aqui teneis la funcion (funciona muy bien en lo que se refiere a limitar la velocidad a 50 kb/s... pero una vez descargado intento extraer el ZIP pero me dice que ná...... (corrupto). Debe ser un problema con los headers, ¿no?

Los comentarios son del autor de la funcion :

Código PHP:
 <?php
function enviar_archivo($archivo$speed
{
    
$ctype="application/zip";
    
    
// Recolectamos información sobre el archivo
    
$archivo_nombre basename($archivo);
  
    
// Empezamos con los headers
    
header("Cache-Control:");
    
header("Cache-Control: public");
    
header("Content-Type: $ctype");
    
    
// Forzamos la descarga en lugar de la apertura
    
$header='Content-Disposition: attachment; filename='.$archivo_nombre;
    
header($header);
    
header("Accept-Ranges: bytes");
    
$tamano filesize($archivo);  
 
 
     
// Si el navegador nos solicita el http_range...
    
if(isset($_SERVER['HTTP_RANGE'])) {
    
// entonces le enviamos sólo el trozo que falta. 
    
list($a$rango)=explode("=",$_SERVER['HTTP_RANGE']);
    
str_replace($rango"-"$rango);
    
$tamano2=$tamano-1;
    
$nueva_longitud=$tamano2-$rango;
    
header("HTTP/1.1 206 Partial Content");
    
header("Content-Length: $nueva_longitud");
    
header("Content-Range: bytes $rango$tamano2/$tamano");
    } else {
    
// Si no le enviamos todo el pack
    
$tamano2=$tamano-1;
    
header("Content-Range: bytes 0-$tamano2/$tamano");
    
header("Content-Length: ".$tamano2);
    }  
    
// Sólo queda abrir el archivo...
    
$puntero_al_fichero fopen("$archivo","rb");
    
// localizar el inicio de la parte que queremos enviar...
    
fseek($puntero_al_fichero,0);
    
// y empezar a enviar. 
    
while(!feof($puntero_al_fichero)) {      
        
set_time_limit(0);      
    
// Ponemos los datos en el buffer...
        
print(fread($puntero_al_fichero,1024*$speed));
    
// Lanzamos el contenido del buffer...
        
flush();
    
// Y a dormir...
        
sleep(1);
    }
    
// archivo descargado
    
fclose($puntero_al_fichero);
    exit;
}

enviar_archivo("zips/ejemplo.zip",50);
?>
  #2 (permalink)  
Antiguo 20/08/2007, 10:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto....

Pequenias cosas, una:

El set_time_limit(0); ponlo antes del while, no es necesario repetir la operacion, segunda, creo no necesitas el flush, y para limitar la velocidad es en el sleep, no en el read.

Saludos.
  #3 (permalink)  
Antiguo 20/08/2007, 11:43
 
Fecha de Ingreso: marzo-2006
Mensajes: 342
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto....

Gracias por la ayuda pero me pasa una cosa muy extraña....

He probado el script con un RAR y con una imagen JPG.... y funciona bien.

En el tipo MIME ( $ctype ) he puesto application/rar para el RAR y image/jpeg para el jpg y me funcionan bien...

pero he probado estos con el ZIP y ninguno me lo baja bien :

application/x-lha-compressed

application/x-zip-compressed

application/zip

multipart/x-zip



Y el ZIP original no está corrupto ya que me lo bajo bien por FTP y se descomprime sin problemas.

¿Que podria ser?

O, ¿Sabeis de alguna otra forma de limitar la velocidad de descarga mediante un script¿ (sin tener que tocar nada del Servidor).

Gracias.
  #4 (permalink)  
Antiguo 20/08/2007, 18:16
 
Fecha de Ingreso: marzo-2006
Mensajes: 342
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Al intentar limitar la velocidad de descarga de un ZIP se descarga corrupto....

le he quitado lo del http_range y ahora los zips se bajan bien..
este es el codigo de ejemplo que he utilizado.

Código PHP:
<?php
function enviar_archivo($archivo$speed
{
    
// Recolectamos información sobre el archivo
    
$archivo_nombre basename($archivo);
      
    
ob_end_clean(); 
    
    
// Empezamos con los headers
    
header("Cache-Control:");
    
header("Cache-Control: public");
    
header("Content-type: application/x-zip");
    
    
// Forzamos la descarga en lugar de la apertura
    
$tamano filesize($archivo);   
    
header("Content-Length: " $tamano);    
    
    
$header='Content-Disposition: attachment; filename='.$archivo_nombre;
    
header($header);
    
header("Accept-Ranges: bytes");  
 
 
     
// Sólo queda abrir el archivo...
    
$puntero_al_fichero fopen("$archivo","rb");
    
// localizar el inicio de la parte que queremos enviar...
    
fseek($puntero_al_fichero,0);
    
// y empezar a enviar. 
    
set_time_limit(0);
    while(!
feof($puntero_al_fichero)) {                    
    
// Ponemos los datos en el buffer...
        
print(fread($puntero_al_fichero,1024*$speed));    
    
// Y a dormir...
        
sleep(1);
    }
    
// archivo descargado,
    
fclose($puntero_al_fichero);
    exit;
}

enviar_archivo("zips/ejemplo.zip",50);
?>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:04.