Foros del Web » Programando para Internet » PHP »

Descargar un archivo de un listado

Estas en el tema de Descargar un archivo de un listado en el foro de PHP en Foros del Web. Buenas, ahora lo que quisiera es buscar alguna forma para poder dar la opción de descargar un archivo de un listado, bien sea en forma ...
  #1 (permalink)  
Antiguo 21/06/2006, 05:27
 
Fecha de Ingreso: marzo-2006
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
Buenas, ahora lo que quisiera es buscar alguna forma para poder dar la opción de descargar un archivo de un listado, bien sea en forma de hipervínculo o con un botón.

El código que tengo para visionar los archivos es el siguiente:

<?php
session_start();
require_once('db_fns.php');

require_once('bookmark_fns.php');

do_html_header('Listado de archivos');

check_valid_user();

display_user_menu();
do_html_footer();

$conn = db_connect();
$result = $conn->query( "select name, size
from file
where usernm = '$_SESSION[valid_user]'");
if (!$result)
print "Error";

$nombre_archivo = array();
$tamanio_archivo = array();

for ($count = 1; $row = $result->fetch_row(); ++$count)
{
$nombre_archivo[$count] = $row[0];

//las siguientes dos líneas sirven para redondear con solo dos decimales

$aux=$row[1]/1024;
$tamanio_archivo[$count] = round($aux * 100) / 100;

}

for ($i=0; $i < $count; $i++)
{
print ($tamanio_archivo[$i]." kB ");
print ($nombre_archivo[$i]);

print "<br />";

}

?>

Lo tengo puesto de tal forma que los datos de nombre y tamaño de cada archivo los saco de la base de datos. Quizá sería mejor sacar los valores con un ls o algo así ya que tengo los archivos de cada usuario en una carpeta personalizada.
También podría ser interesante poner la ruta de cada archivo en la base de datos.
Acepto sugerencias, gracias.
  #2 (permalink)  
Antiguo 21/06/2006, 08:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si lo quieres en un archivo .. lo primero sería generar tu "Archivo" valga la rebundancia sobre una variable.

Si vas a generar un formato "texto plano" .. tendrás que respetar los "saltos" de línea y otros formatos de este tipo de archivos .. Por ejemplo, el salto de línea es un caracter de control tipo "\n" .. o un tabulador es un "\t" por ejemplo ..

Según esto sería:

Código PHP:
$archivo '';
for (
$i=0$i $count$i++)
{
$archivo .= $nombre_archivo[$i]." ".$tamanio_archivo[$i]." kB\n";

En $archivo .. acomulado (por eso se usa el .=) te quedaría tu archivo .. ya sea para que le hagas un "print" ( o mejor un echo simplemente) .. o generes un archivo (con fopen() y afines ...) o lo entregues a descargar directamente.

Si te fijas .. este proceso no corresponde nada de HTML .. debería ser un script que lo llames por un link tipo "descargar" que apunte a este script sólo .. nada más (si quieres usas este mismo código pero para hacer tu pre-visualización en HTML como ahora lo haces).

Siguiendo con esta filosofía .. lo ideal es forzar la descarga del archivo inmediatamente .. (ya que este es tu fin último u objetivo en este caso).

Para entregar un archivo a descargar .. es necesario componer las cabeceras HTTP adecuadas para indicar que el archivo (el navegador) lo entienda que es para descargar .. Una vez generadas estas cabeceras .. sólo queda entregar el "dato" al buffer de salida .. es decir, un simple "echo" de tu variable que contiene todo tu "Archivo" generado ...

Quedaría algo tipo:

Código PHP:
// Forzamos la descarga (sea el tipo de archivo que sea ..) Ojo con esto .. algunos navegadores no podrían comportarse de la misma forma .. es decir, no entender que se le indica que el archivo es para descargar.
header("Content-Type: application/force-download");

// Se va a llamar nose.txt
header('Content-Disposition: attachment; filename="nose.txt"');

// Se entrega al buffer de salida
echo $archivo
Es importante que para este script le quites TODO el HTML que puedas tener ahora mismo generandose .. NO corresponde. Y como te comenté .. que lo llames en forma individual como una petición nueva al servidor .. (por un link ..) no sirve un "include()" o algo así (por lo menos como está el código sin uso de otras funciones de gestión del buffer de PHP que para este caso son innecesarias ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 21/06/2006, 10:23
 
Fecha de Ingreso: marzo-2006
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
Hola, la idea no es tener en un archivo todos los nombre con las tamaños y luego descargarlo, sino poner algo (un boton o un link) por cada archivo que salga (estos pueden ser dos, cincuenta o los que sean que haya en la base de datos y que luego son listados en el "for") para poder descargarlo metiendo la ruta absoluta o relativa del archivo en el boton o en el link.
  #4 (permalink)  
Antiguo 21/06/2006, 10:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por pepe500
Hola, la idea no es tener en un archivo todos los nombre con las tamaños y luego descargarlo, sino poner algo (un boton o un link) por cada archivo que salga (estos pueden ser dos, cincuenta o los que sean que haya en la base de datos y que luego son listados en el "for") para poder descargarlo metiendo la ruta absoluta o relativa del archivo en el boton o en el link.
Ok .. (tu exposición anterior realmente no me quedó claro que deseabas hacer).

En ese caso .. para empezar generando el HTML correspondiente a un link con tu dato que es el nombre del archivo te podría servir:

Código PHP:
echo "<a href=\"".$nombre_archivo[$i]."\">descargar</a>"
(Si es necesario añade la ruta donde están tus archivos en el href ...)

También podrías hacer un gestor de descargas más avanzado usando la filosofía que indiqué en mi anterior mensaje sobre uso de header() (y ahora necesitarías readfile() también ...)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 21/06/2006, 11:54
 
Fecha de Ingreso: marzo-2006
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
Muchas gracias, ya me funciona.

Por otro lado, ni lo de "\n" ni lo de "\t" me funciona. Por eso he utilizado "<br />" para el salto de línea, y me gustaría saber si hay otra forma de hacer tabulación ya que "\t" no me ha funcionado. Quiza sea porque uso PHP 5.1.2

También me sucede que en el primer enlace "descargar" del listado de archivos, me lleva a un índice de los archivos del usuario en cuestión.
Esto tambien me sucede cuando introduzco una url en la que no se especifica ningún archivo

por ej: localhost/ricardo/

Quisiera que no me saliese el primer enlace ese del listado y tampoco el indice de archivos al poner la ruta incompleta.
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 10:52.