entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Link descarga PHP

Hola Buen Dia Desarroladores, mi consulta es la siguiente:

Tengo una opcion en mi web en la cual permito subir archivos a una carpeta llamada "archivos" en la cual guardo sin ningun problema, luego pongo el listado de los archivos dentro de una session de usuario y me muestra la lista complete a los usuario hasta ahi todo bien, el problema viene a la hora de querer descargar ese archivo, puesto que no logro hacerle el link de descarga, dejo mi codigo a continuacion con el que muestro y genero el link:

<?php

$directorio = opendir("archivos"); //ruta actual
while ($archivo = readdir($directorio)) //obtenemos un archivo y luego otro sucesivamente
{
    if (is_dir($archivo))//verificamos si es o no un directorio
    {
        echo "[".$archivo . "]<br />"; //de ser un directorio lo envolvemos entre corchetes
    }
    else
    {
        echo "<a href='$directorio'> $archivo <a /><br>";
    }
}

?>

Bien , al hacer click en el archivo lo que sucede es que me envia a index.php , en todos los archivos,

IMG

He probado con esta variable extra:

$ruta = "archivos/". $archivo;
echo "<a href='$ruta'> $archivo <a /><br>";

y me envia a la lista directa de el servidor en donde si me deja descargar pero me muestra la carpeta completa atraves del servidor como si ingresara directamente con la url a la carpeta y no a travez de la web

img 2

agradezco su ayuda de antemano.

1 Respuesta

3votos

Leonardo-Tadei Puntos222870

Hola @indiglosv,

si no veo mal cuándo armás el URL programáticamente, te está faltando la parte del nombre de archivo.

Sería así:

<?php

$directorio = opendir("archivos"); //ruta actual
while ($archivo = readdir($directorio)) //obtenemos un archivo y luego otro sucesivamente
{
    if (is_dir($archivo))//verificamos si es o no un directorio
    {
        echo "[".$archivo . "]<br />"; //de ser un directorio lo envolvemos entre corchetes
    }
    else
    {
        echo "<a href='$directorio$archivo'> $archivo <a /><br>";
    }
}

y si $directorio no termina con /, hay que agregársela en el medio de las variables para que la ruta quede bien formada.

Saludos cordiales!

indiglosv comentado Feb 26

Gracias por tu respuesta:

intente agregando los valores indicados y me da error not found, creo que tengo un problems de rutas

por Si sieve este es el link que me genera con la modificacion en casa archivo.

http://midominio.com/Resource%20id%20#3TAREAS SEGUNDO CICLO.pdf

Leonardo-Tadei comentado Feb 26

Si los archivos están en http://midominio.com/ no tenés un problema de rutas. Si están en un directorio de http://midominio.com/ y no aparece ahí, sí que lo tenés, como si te faltara concatenar el nombre del directorio como te indico en la respuesta.

Luego, el problema que sí tenés seguro es que no estás codificando los nombres de los archivos para que puedan formar parte de una ruta válida. El navegador corta al primer espacio que encuentra, así que buscará http://midominio.com/Resource%20id%20#3TAREAS en vez de http://midominio.com/Resource%20id%20#3TAREAS SEGUNDO CICLO.pdf

Tenés que codificar el nombre del archivo antes de concatenarlo con la función urlencode() para generar URL válidos para el navegador.

Cuidado! No codifiques lo que ya está codificado, como el nombre del directorio, porque en ese caso fallará también.

Saludos cordiales!

indiglosv comentado Feb 26

De hecho si, los archivos de encuentra en una carpeta:
midominio.com/archivos

Estoy haciendo la concatenación en ambas variables es decir:

.$directorio.$archivo.

Ahora con lo de codificar la URL por cada espacio entiendo que debo entonces guardar los archivos con nombres sin espacio.

Leonardo-Tadei comentado Feb 27

Hola @indiglosv,

es raro lo que me decís de que los archivos está físicamente en:
midominio.com/archivos
porque en la salida de tu código que ponés más arriba aparece:
midominio.com/Resource%20id%20#3TAREAS SEGUNDO CICLO.pdf
en dónde no aparece en la ruta la palabra "archivos"...

Respecto a los nombres de los archivos, podrías guardarlos sin espacio, pero tendrías que filtrar también todo caracter y combinación de caracteres que tenga un código HTML... se puede hacer, pero es muy complejo.

Es más simple que el bucle en dónde se generan los A pongas:

   echo "<a href='".$directorio.urlencode($archivo)."'> $archivo </a><br />

para codificar al vuelo los nombres que lo requieran...

indiglosv comentado Feb 27

Si los archivos los subo a una carpeta, por eso te mencionaba que estaba usando esta variable

$ruta = "archivos/". $archivo;

Para tratar de indicarle la ruta a la carpeta, pero al hacerlo así, cuando hago click en cualquier archivo me manda directamente a la carpeta del servidor en donde veo todos los archivos.

Esta dirección

http://midominio.com/Resource%20id%20#3TAREAS

Es la que me da cuando realizo la concatenación usando las 2 variables como tu me lo has indicado al principio, es decir que no logro entender a donde le voy a indicar la ruta de la carpeta.

Actualmente lo tengo así

echo "<a href='".$directorio.urlencode($archivo)."'> $archivo </a><br />

Pero me sigue mostrando note foud 404
Gracias por tu tiempo

Leonardo-Tadei comentado Feb 27

Hola @indiglosv,

ya veo de dónde aparece el "Resource id #3" que te aparece (codificado con los %20 en lugar del espacio) en la ruta: estás usando mal la función readdir() y tratando el recurso (handler) que devuelve como si fuera un nombre de archivo...

Mejor que solucionar esto, te conviene pasarte a las funciones más nuevas de lectura de directorios, como scandir():

<?php
//ruta actual
$ruta = "archivos";
$directorio = scandir($ruta); // esto devuelve un vector!
foreach ($directorio as $archivo) //obtenemos el nombre del archivo y luego otro sucesivamente
{
    if (is_dir($archivo))//verificamos si es o no un directorio
    {
        echo "[".$archivo . "]<br >"; //de ser un directorio lo envolvemos entre corchetes
    }
    else
    {
        echo "<a href='".$ruta.'/'.urlencode($archivo)."'> $archivo </a><br >";
    }
} // del foreach

Usar scandir no solo tiene como ventaja que devuelve un vector, en vez de un handler, sino que cada elemento del vector es un string que contiene el nombre del archivo (en vez de un handler a un archivo) con lo que para este uso es muchísimo más simple.

Saludos cordiales

indiglosv comentado Feb 28

Hola Leonardo.

Entiendo que el foreach me va traer los elementos del directorio como resultado y si de hecho me los muestra, pero me sigue fallando la ruta y es lo que no logro comprender.

Tango el codigo actualizado asi:

$directorio = scandir("archivos"); //ruta actual
foreach ($directorio as $archivo) //obtenemos un archivo y luego otro sucesivamente
{
    if (is_dir($archivo))//verificamos si es o no un directorio
    {
        echo "[".$archivo . "]<br >"; //de ser un directorio lo envolvemos entre corchetes
    }
    else
    {
        echo "<a href='".$directorio.'/'.urlencode($archivo)."'> $archivo <a ><br>";
    }
}
``

Pero ahora la URL me muestra la dirección con el array



http://midominio.com/Array/Capture2.PNG

Leonardo-Tadei comentado Feb 28

Hola @indiglosv,

en mi respueta mezclé el array con la ruta... ahí la edité para separarla y que quede más claro.

indiglosv comentado Feb 28

Gracias Leonardo por tu guia ya esta trabajando perfectamente el script, ahora solo me resta darle un poco de estilo para que se vea bien.

entendi que practicamente para este caso es major un foreach que un while como lo tenia al principio.

saludos y nuevamente gracias.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta