Foros del Web » Programando para Internet » PHP »

forzar la descarga de un archivo

Estas en el tema de forzar la descarga de un archivo en el foro de PHP en Foros del Web. como se fuerza la descarga de un archivo en vez de su visualizacion en el browser uso este enlace para que me salga la ruta ...
  #1 (permalink)  
Antiguo 27/02/2008, 20:44
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
forzar la descarga de un archivo

como se fuerza la descarga de un archivo en vez de su visualizacion en el browser
uso este enlace para que me salga la ruta almacenada en la DB

echo "<tr><div align=center><a href=archivos/$row[ruta]>Descargar</a></div>";
donde
archivos/$row[ruta] es el enlace que me hace que los archivos se visualicen en vez de forzar su descarga
Alguien sabria, o un enlace a informacion

el archivo no esta en la base de datos, esta en un carpeta del web
en la base de datos esta solo la ruta que me lleva al archivo para su descarga.

Gracias.
  #2 (permalink)  
Antiguo 28/02/2008, 02:09
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
Re: forzar la descarga de un archivo

usando un link a una pagina en la que tienes un header especifico:

http://es2.php.net/header

mira el ejemplo del pdf.
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #3 (permalink)  
Antiguo 28/02/2008, 05:32
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

pero es que ya uso un link que almaceno en la base de datos, que apunta a la carpeta donde estan los archivos, no utilizo ningun otro script para descargarlo,

lo unico que hago es guardar la ruta en la DB al mismo tiempò que los subo
pero estan en un carpeta del web y como ya digo no uso otro script para descargar el archivo, ya me aparece el enlace al archivo al hacer el query a la DB
Donde poner el HEADER en la pagina donde hago el query?
  #4 (permalink)  
Antiguo 28/02/2008, 05:44
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
Re: forzar la descarga de un archivo

lo que tienes que hacer es llamar a una pagina PHP pasandole el nombre del fichero por ejemplo por GET y segun su extension crear el header y asi forzar la descarga
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #5 (permalink)  
Antiguo 28/02/2008, 05:59
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

mire, este es el codigo que uso para listar los archivos y que me aparexca un link a la carpeta donde esta el archivo, sin pasar por un archivo para su descarga,

Código PHP:
        $conexion mysql_connect('localhost','user','9999)or die ('Ha fallado la conexión'.mysql_error());
         mysql_select_db('
registro')or die ('Error al seleccionar la Base de Datos: .mysql_error());
 
 
$_pagi_sql "SELECT   id, name, description, ruta, tipo, size FROM archivos";  
$_pagi_result mysql_query($_pagi_sql $conexion) or die ( mysql_error() );  
 

  
    
//Sentencia sql (sin limit)
//$_pagi_sql = mysql_result($res);

//cantidad de resultados por página (opcional, por defecto 20)
$_pagi_cuantos 2;//Elegí un número pequeño para que se generen varias páginas

//cantidad de enlaces que se mostrarán como máximo en la barra de navegación
$_pagi_nav_num_enlaces 3;//Elegí un número pequeño para que se note el resultado

//Decidimos si queremos que se muesten los errores de mysql
$_pagi_mostrar_errores false;//recomendado true sólo en tiempo de desarrollo.

//Si tenemos una consulta compleja que hace que el Paginator no funcione correctamente, 
//realizamos el conteo alternativo.
$_pagi_conteo_alternativo true;//recomendado false.

//Supongamos que sólo nos interesa propagar estas dos variables
$_pagi_propagar = array("id","termino");//No importa si son POST o GET

//Definimos qué estilo CSS se utilizará para los enlaces de paginación.
//El estilo debe estar definido previamente
$_pagi_nav_estilo "paginacion";

//definimos qué irá en el enlace a la página anterior
$_pagi_nav_anterior "&lt;";// podría ir un tag <img> o lo que sea

//definimos qué irá en el enlace a la página siguiente
$_pagi_nav_siguiente "&gt;";// podría ir un tag <img> o lo que sea

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("paginator.inc.php");

//Leemos y escribimos los registros de la página actual
while($row mysql_fetch_array($_pagi_result)){

echo 
"<table width=70%><tr bgcolor= #61e877><div align=center>";

echo 
"<b>Titulo: </b>";
echo 
$row[name];
echo 
"</div></tr>";
echo
"<tr>&nbsp;</tr>";
echo 
"<tr bgcolor= #cccccc><b> &nbsp;&nbsp;&nbsp;Descripcion: </b><br>";

echo 
$row[description];
echo 
"</tr>";

echo
"<tr bgcolor= #cccccc >&nbsp;</tr>";
echo 
"<tr bgcolor= #cccccc><b> &nbsp;&nbsp;&nbsp;Tamaño: </b>";
echo 
$row[size]." Bytes";
 
echo 
"</tr>";


echo
"<tr bgcolor= #cccccc>&nbsp;</tr>";
echo 
"<tr bgcolor= #cccccc><div align=center><a href=archivos/$row[ruta]>Descargar</a></div>";
echo 
"</tr>";
echo
"<tr bgcolor= #cccccc>&nbsp;</tr>";

echo 
"</table>" ;

}

echo 
"<table width=50%><tr bgcolor= #61e877><div align=center>";
//Incluimos la barra de navegación

echo"<p>".$_pagi_navegacion."</p>";
echo 
"</div></tr>";
echo
"<tr>&nbsp;</tr>";
//Incluimos la información de la página actual

echo"<tr><div align=center><p>Resultados ".$_pagi_info."</p></div>";
echo 
"</tr>";    
echo 
"</table>" 
y en esta linea es donde muestro el enlace DESCARGAR que tiene una ruta almacenada en la DB,

echo "<tr bgcolor= #cccccc><div align=center><a href=archivos/$row[ruta]>Descargar</a></div>";

como complementaria yo, para que ahora pase a u8n archivo para forzar si descarga,

el script mas omenos lo tengo, pero no lo uso y es:

Código PHP:

<?
mysql_connect
('localhost','user','9999)or die ('Ha fallado la conexión'.mysql_error());
mysql_select_db('
registro')or die ('Error al seleccionar la Base de Datos'.mysql_error());
$id = $_GET['
id];
$qry "SELECT  ruta, tipo FROM archivos";
$res mysql_query($qry) or die( "Error en Query: $qry, error: " mysql_error() );
$row mysql_fetch_row$res );
$tipo $row["tipo"];
$ruta $row["ruta"];
header"Content-Disposition: attachment; filename=".$row[ruta]."");
header"Content-type: application/octet-stream" );

print 
$contenido;

Gracias.
  #6 (permalink)  
Antiguo 28/02/2008, 09:20
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: forzar la descarga de un archivo

Ese script te sirve para bajar de una base de datos, lo que tu tienes que hacer es pasarle la ruta a ese archivo para descargarlo, por decir si lo envias así:
Código PHP:
echo "<tr bgcolor= #cccccc><div align=center><a href=\"descargar.php?ruta=archivos/$row[ruta]\">Descargar</a></div>"
Luego en tu aplicación lo rescatas y envias:
Código PHP:
$ruta $_GET['ruta'];
$archivo_arr explode"/"$ruta );
$archivo $archivo_arr[count($archivo_arr) - 1];

if( !
file_exists$ruta ) ) {
         die( 
"No existe $ruta" );
}

header"Content-Disposition: attachment; filename=".$archivo."");
header"Content-type: application/octet-stream" ); 

@
readfile$archivo ); 
Saludos.
  #7 (permalink)  
Antiguo 28/02/2008, 09:36
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

Gracias GatorV
acabo de provarlo de nuevo
pero ya prove ese script, o algo muy similar, ayer y lo que me hace es forzar la descarga pero los descarga vacios.

Y de la otra forma, si estan en rar o zip, los descarga pero con su contenido.
si no los visualiza.

no lo entiendo,

Gracias.
  #8 (permalink)  
Antiguo 28/02/2008, 09:39
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: forzar la descarga de un archivo

Es muy raro, ya que ese script debería de funcionar para descargar el archivo si esta especificado correctamente.

Saludos.
  #9 (permalink)  
Antiguo 28/02/2008, 09:40
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: forzar la descarga de un archivo

Mmm... no entiendo la utilidad de las líneas 2 y 3

No debería ser:

Código PHP:
@readfile$ruta ); 
??

Saludos!
  #10 (permalink)  
Antiguo 28/02/2008, 09:42
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

no se, ya no llego a tanto,
me imagino que esta bien especificado, por que de la otra manera los zip los descarga muy bien y forzando la descarga, revisare el codigo, a ver si se me ha escapado la ruta o algo
Gracias.
  #11 (permalink)  
Antiguo 28/02/2008, 09:47
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: forzar la descarga de un archivo

Me refiero a esto:

Código PHP:
$archivo_arr explode"/"$ruta );
$archivo $archivo_arr[count($archivo_arr) - 1]; 
Entiendo que así estamos obteniendo el nombre del archivo simplemente, sin importar la ruta en la que se encuentra.

Al hacer esto:
Código PHP:
if( !file_exists$ruta ) ) {
         die( 
"No existe $ruta" );

Estamos verificando si existe el archivo con la ruta especificada en la URL, incluyendo su folder contenedor (archivos/)

y luego al descargar usamos la variable $archivo, que sólo contiene el nombre del archivo. No hay cierta incongruencia? Si verificamos si existe el archivo contenido en $ruta, pues es eso lo que debemos leer usando readfile().

Saludos!
  #12 (permalink)  
Antiguo 28/02/2008, 09:48
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

Ahora si

Gracias Okram
Ahora si que fuerza la descarga, y los descarga con su contenido, va perfecto.
era ese detalle:

@readfile( $ruta );


Gracias de nuevo, y a GatorV que tambien se ha roto el coco con esta aplicacion.
  #13 (permalink)  
Antiguo 28/02/2008, 09:50
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: forzar la descarga de un archivo

Cierto la linea correcta es @readfile( $ruta ); Lo de la linea 2 y 3 es simplemente para enviar el nombre al explorador, de lo contrario saldría:
Cita:
¿Deseas descargar descargar_archivo.php?
Y lo que interesa es que salga el nombre del archivo.

Saludos.
  #14 (permalink)  
Antiguo 28/02/2008, 09:53
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Re: forzar la descarga de un archivo

Gracias a los dos ahora descarga perfecto, voy a cambiarlo en el aporte, gracias de verdad.
  #15 (permalink)  
Antiguo 28/02/2008, 09:55
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: forzar la descarga de un archivo

Valdría también poner:

Código PHP:
// En vez de
 
# $archivo_arr = explode( "/", $ruta );
# $archivo = $archivo_arr[count($archivo_arr) - 1];
 
$archivo basename$ruta ); 
Saludos,
  #16 (permalink)  
Antiguo 28/02/2008, 09:57
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: forzar la descarga de un archivo

Cierto, aunque no se que tan bien sirva con rutas relativas (si pasara una relativa..)

Saludos.
  #17 (permalink)  
Antiguo 13/08/2008, 06:57
 
Fecha de Ingreso: mayo-2008
Mensajes: 17
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: forzar la descarga de un archivo

aunque sea de varios meses,

un aporte para seguridad:


Se trata de filtrar los enlaces en 'descargar.php':


Código PHP:
$ruta $_GET['ruta'];
$archivo_arr explode"/"$ruta );
$archivo $archivo_arr[count($archivo_arr) - 1];

if( !
file_exists$ruta ) ) 
{
         die( 
"No existe $ruta" );
}
if( 
substr($ruta09)!='archivos/'
{
         die( 
"Descarga no permitida" );
}
header"Content-Disposition: attachment; filename=".$archivo."");
header"Content-type: application/octet-stream" ); 
@
readfile$ruta ); 

con este ejemplo solo podriamos hacer descargas de archivos en la carpeta "archivos/"
ya que, al no incluir ese código, podriamos llamar desde el navegador por ejemplo algo tal que así:

Cita:
www.pagina.com/descargar.php?ruta=index.php
y si tienes base de datos te cogen hasta los calzones por decir algo jejeje
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 00:44.