Cómo están..
He estado mirando en otras discuciones y no encuentro solución, ya intenté de todo y mi problema persiste. ojalá que me puedan ayudar.
Resulta que estoy haciendo un sistema de descargas.
tengo una tabla que almacena en un campo el nombre el archivo, que puede ser ZIP, MP3, O JPG o cualquier otro. de esta manera "archivo.XXX"
en el código en cuestión, jalo una variable que contiene el id de archivo y mediante una consulta a mysql obtengo el campo "url" que es donde almaceno el nombre del archivo.
Todo funciona hasta que se quiere abrir el archivo descargado. PAF!.. esta corrupto y no se puede abrir. Lo curioso es que incluso cuando el archivo se descarga lo hace demaciado rápido aún cuando su tamaño sea de más de 10Mb.
Les adjunto el codigo en cuestión. Espero me puedan ayudar a detectar el error o me aconsejen qué hacer para bajar los archivos correctamente.
Saludos a todos
Codigo:
Código PHP:
<?php
//compruebo que este logeado en joomla pues desde ahi tengo detectado al usuario
$ruta_a_joomla = "/../";
define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).$ruta_a_joomla ));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
require_once ( JPATH_BASE .DS.'configuration.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
$userx = &JFactory::getUser();
if($userx->guest){
die ("Favor de iniciar sesion");//si no está logueado pido que incie sesión en joomla
} else {
//si esta logeado entonces recopilo las variables mediante POST. ¿es posible que necesite ser GET.. no lo se?
$clavetemporal= $_POST["clave"];//variable con la clave password del usuario con la que compruebo que la descarga esté autorizada
$clavecontenido= $_POST["contenido"];//variable con la ID de la descarga
$usuario= $userx-> name;//nombre del usuario obtenido de la sesion de joomla
//inicio mi conexion a la BD
$conexion=mysql_connect("localhost","myuser","mypassword")
or die("No se puede conectar al server");
mysql_select_db("hachette",$conexion)
or die("No se puede seleccionar la BD");
//creo mis consultas para validad la descarga y para obtener el campo "url" de la descarga que contiene el nombre del archivo.
$consulta="SELECT * FROM `luc_hist_claves` WHERE clavecont=$clavecontenido AND name='$usuario' and cavetemp='$clavetemporal'";
$consulta2="SELECT * FROM `luc_cat_cont` WHERE clavecont=$clavecontenido";
$resultado=mysql_query($consulta,$conexion)
or die("Operacion fallida: $consulta");
$resultado2=mysql_query($consulta2,$conexion)
or die("Operacion fallida: $consulta2");
$row=mysql_fetch_array($resultado2);
if (mysql_num_rows($resultado) == 0){
die( "Lo siento, su clave no existe, ya no es vigente o no esta relacionada con la descarga solicitada. Solicite una nueva con su asesor pedagogico. Puede ir atras e intentar de nuevo");
}else {
//Aquí esta lo RUDO.. una vez que compruebo que la clave está autorizada viene el código que me da problemas... incluso ya probe quitando todo lo demás y dejando la descarga sola y nada siguen bajando corruptos.
//primero verifico que el campo URL con el nombre del archivo este lleno
if (!isset($row['url']) || empty($row['url'])) {
exit();
}
//Ahora establezco la ruta y el nombre del archivo y formo en PATH completo en la variable "path"
$root = "packs/";
$file = basename($row["url"]);
$path = $root.$file;
$type='';
//compruebo que se trate de un archivo y obtengo su tamaño, y tipo de archivo
if(is_file($path)) {
$size = filesize($path);
if (function_exists('mime_content_type')) {
$type = mime_content_type($path);
} else if (function_exists('finfo_file')) {
$info = finfo_open(FILEINFO_MIME);
$type = finfo_file($info, $path);
finfo_close($info);
}
//si no tengo el tipo de archivo es decir que la cadena esté vacia porque a lo mejor no exista la libreria mime_content_type, pues forzamos la descarga
if ($type == '') {
$type = "application/force-download";
}
// Ahora los headers que es donde creo que tengo el problema
header("Content-Type: $type\n\r");
header("Content-Disposition: attachment; filename=$file\n\r");
//header("Content-Transfer-Encoding: binary\n\r");
header("Content-Length: " . $size."\n\r");
// Y descargo
readfile($path); //en algunos ejemplos ponen una @ antes de este instrucción. lo intente con ambas opciones
} else {
//si no existe el archivo entonces avisamos
die("No existe el archivo!!");
}
//echo "descarga correcta"; no se si ponerlo también
}
}
?>