Problema de peso con descarga forzada
Buenas gentes,
armé (con retazos que fui encontrando por internet) en php y mysql un pequeño sistema en el que el usuario con un código accede a la descarga de un .zip
el problema es que el .zip pesa unos 80 megas y, según vi, crea problemas con el caché del servidor. por eso, se divide el archivo en CHUNKS para que no sature la memoria del servidor.
El problema es que una vez descargado el .zip tira el siguiente error al intentar abrirlo:
"! D:\descargas temporales\lspgsm.zip: The archive is either in unknown format or damaged"
El código que utilizo es el siguiente:
<?
define('CHUNK_SIZE', 1024*1024); // Size (in bytes) of tiles chunk
// Read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE) {
$buffer = '';
$cnt =0;
// $handle = fopen($filename, 'rb');
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, CHUNK_SIZE);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
/// COMIENZA LA DESCARGA ///
$contrasena=$_POST[contrasena];
$email=$_POST[email];
if(empty($contrasena)){header("location: online.php?error=1");}
$connect=mysql_connect ("dbp03.xxx.com", "xxx_xxx", "xxx") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("xxx_xxx");
//// SI TODO BIEN ///
$result=mysql_query("select * from discos WHERE contrasena LIKE '%$contrasena%'", $connect);
/// CUANDO NO EXISTE EL CÓDIGO ///
if(mysql_num_rows($result) == 0){header("location: online.php?error=2");}
while($row=mysql_fetch_array($result))
{
$filename = $row[archivo];
if (file_exists($filename)) {
$desde="";
$cont_cont=$row[cont_cont];
$cont_cont++;
$id=$row[id];
if ($email!=""){$email=$row[email]. ", " .$email;} else {$email=$row[email];} ///Si el email no está vacío, lo suma a la lista, si no, la deja tal cual ///
mysql_query("UPDATE discos SET cont_cont='$cont_cont', email='$email' WHERE id='$id'", $connect);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($filename));
readfile_chunked($filename);
exit;
}
}
?>
Alguien tiene alguna idea de cómo solucionarlo o por dónde buscar.
Se me ocurre que quizás también se pueda hacer algo desde el .htaccess
Gracias de antemano.