Foros del Web » Programando para Internet » PHP »

No puedo descargar archivos

Estas en el tema de No puedo descargar archivos en el foro de PHP en Foros del Web. Tengo una página con la lista de los archivos a descargar listar_archivos.php: //la conexion la tengo hecha, pero aquí la omito $qry = "SELECT ID, ...
  #1 (permalink)  
Antiguo 06/03/2006, 09:44
 
Fecha de Ingreso: septiembre-2005
Mensajes: 14
Antigüedad: 18 años, 6 meses
Puntos: 0
No puedo descargar archivos

Tengo una página con la lista de los archivos a descargar listar_archivos.php:
//la conexion la tengo hecha, pero aquí la omito
$qry = "SELECT ID, filename, filetype, filesize FROM temaris2";
$res = mysql_query($qry);

while ($row=mysql_fetch_array($res))
{
echo '<tr><td>'.$row["ID"].'</td>';
echo '<td>'.$row["filename"].'</td>';
echo '<td>'.$row["filetype"].'</td>';
echo '<td>'.$row["filesize"].'</td></tr>';
echo "<a href='descargar_archivo.php?ID=$row[ID]'>Descargar</a>";

}
mysql_free_result($res)
El enlace Descargar me manda a la página descargar_archivo.php:
//También omito aquí la conexion, pero la tengo hecha
$query = mysql_query("SELECT ID, filename, filetype, filesize, filecontents FROM temaris2 WHERE ID='$ID'");
if(mysql_num_rows($query) ==1)
{
$fileName = mysql_result($query,0,0);
$fileType = mysql_result($query,0,1);
$fileSize = mysql_result($query,0,2);
$fileContents = mysql_result($query,0,3);
header("Content-type: $fileType");
header("Content-length: $fileSize");
echo $filecontents;
}
else
{
echo "Arxiu inexistent";
}


Pues bien, Cuando le doy a descargar se me descarga el archivo descargar_archivo php en vez del que se deberia descargar que esta en la base de datos en el campo filecontents. Alguien sabe por qué? O que he hecho mal en el código?
Gracias de antemano.
  #2 (permalink)  
Antiguo 06/03/2006, 10:10
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 21 años, 11 meses
Puntos: 7
usa tambien
header("Content-Disposition:attachment;filename=".$filename);
__________________
No tengo firma ahora... :(
  #3 (permalink)  
Antiguo 06/03/2006, 10:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Algunos navegadores o gestores de descargas no interpretan por igual las cabeceras HTTP para indicarle que el dato que se envia es para que lo descargue.

En tu caso usas muy pocas cabeceras HTTP .. Deberías usar más.

De todas formas esto depende de la versión y que navegador que uses .. el mismo código en várias versiones de navegadores no se comporta igual.

Por aquí tienes comentarios (de los usuarios) al respecto y código que dicen solventar el problema:
http://www.php.net/readfile

Hay algunos que intentan identificar el navegador (o cliente mejor dicho) para entregarle las cabeceras HTTP que mejor entienda este.

Un saludo,
  #4 (permalink)  
Antiguo 06/03/2006, 10:25
 
Fecha de Ingreso: septiembre-2005
Mensajes: 14
Antigüedad: 18 años, 6 meses
Puntos: 0
Quizas no me he explicado bien. La ventana para descargar (abrir o guardar el archivo) ya me sale , el problema es que siempre me dice "confirme que desea descargar el archivo descargar_archivo.php desde el sitio etc...", y ese no es el archivo que quiero descargar(esa es la pagina que me tiene que descargar el archivo). No creo que eso sea problema de las cabezeras no?
  #5 (permalink)  
Antiguo 06/03/2006, 10:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por jordinogue
Quizas no me he explicado bien. La ventana para descargar (abrir o guardar el archivo) ya me sale , el problema es que siempre me dice "confirme que desea descargar el archivo descargar_archivo.php desde el sitio etc...", y ese no es el archivo que quiero descargar(esa es la pagina que me tiene que descargar el archivo). No creo que eso sea problema de las cabezeras no?
Pues si ..

Para que tu navegador abra la ventana de "descargar" le envias ciertas cabeceras HTTP .. para indicar el nombre del archivo que se ofrecerá para descargar (que puede ser distinto del nombre del archivo original) le indicas otras cabeceras:

header("Content-Disposition:attachment;filename=".$filename);
(te lo mencionó Mikel)

Esto es parte del protocolo HTTP que tiene su definición y habría que "respetarlo" (y ojalá los navegadores y clientes así también lo respetasen).

Con esa cabecera HTTP por lo menos se define el nombre del archivo y el tipo de dato que estás enviando en forma de un "ajunto" o "inline" (incrustrado podría ser también) .. A esto último es lo que me refiero que -pese- haber puesto esas cabeceras HTTP concretas que definen ese nombre y tipo de dato a enviar y así procesar -algunos- navegadores o gestores de descargas (clientes) NO representan bien los datos que se les obliga a que indiquen en la descarga.


Un saludo,
  #6 (permalink)  
Antiguo 06/03/2006, 10:58
 
Fecha de Ingreso: septiembre-2005
Mensajes: 14
Antigüedad: 18 años, 6 meses
Puntos: 0
Ok, La cabezera que me indicó Mikel ya la agregué pero sigue sin funcionar. Seguiré buscando. Gracias de todos modos.
  #7 (permalink)  
Antiguo 06/03/2006, 11:21
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Lee la documentación sobre readfile() y comentarios de usuarios (el link que dejé) .. tienes un montón de código para que pruebes y comentarios para que leas.

Un saludo,
  #8 (permalink)  
Antiguo 07/03/2006, 02:17
 
Fecha de Ingreso: septiembre-2005
Mensajes: 14
Antigüedad: 18 años, 6 meses
Puntos: 0
Pues ya lo solucioné. A veces volver atras y buscar otro camino es lo mejor.
No era problema de cabezaeras sino de variables.
aquí dejo el ejemplo para si alguien lo necesita:
listar_archivos.php:
<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
mysql_connect('servidor','usuario','contraseña');
mysql_select_db('BBDD');
$query = "SELECT ID, filename FROM temaris2";
$result = mysql_query($query) or die('Error, la consulta no es pot realitzar');
if(mysql_num_rows($result) == 0)
{
echo "No hi ha cap temari<br>";
}
else
{
while(list($ID, $filename) = mysql_fetch_array($result))
{
?>
<a href="descargar_archivo.php?ID=<?=$ID;?>"><?=$file name;?></a> <br>
<?
}
}

?>
</body>
</html>
y la pagina descargar_archivo.php:
<?
mysql_connect('servidor','usuario','contraseña');
mysql_select_db('BBDD');

if(isset($_GET['ID']))
{

$ID = $_GET['ID'];
$query = "SELECT filename, filetype, filesize, filecontents FROM temaris2 WHERE ID = '$ID'";
$result = mysql_query($query) or die('Error, la consulta ha fallat');
list($filename, $filetype, $filesize, $filecontents) = mysql_fetch_array($result);

header("Content-Disposition: attachment; filename=$filename");
header("Content-length: $filesize");
header("Content-type: $filetype");
echo $filecontents;
}

?>

Un saludo
  #9 (permalink)  
Antiguo 17/03/2006, 12:14
Avatar de Bullet  
Fecha de Ingreso: agosto-2005
Ubicación: Margarita, Venezuela
Mensajes: 235
Antigüedad: 18 años, 8 meses
Puntos: 1
q mas pana, spero estes bien, me podrias pasar el script de subida para probar con mi pagina, s q tngo un problema parecido, solo q yo los pueod descargar, el problema es q el archivo cuando abre esta lleno de basura. Saludos!!!
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 18:22.