Foros del Web » Programando para Internet » PHP »

Dercargar achivos.

Estas en el tema de Dercargar achivos. en el foro de PHP en Foros del Web. hola. Soy nuevo en php. Estoy haciendo una web y tengo un link en el que quiero que se descargue un archivo pero no me ...
  #1 (permalink)  
Antiguo 13/03/2010, 16:52
 
Fecha de Ingreso: febrero-2010
Mensajes: 27
Antigüedad: 14 años, 2 meses
Puntos: 0
Dercargar achivos.

hola.

Soy nuevo en php.
Estoy haciendo una web y tengo un link en el que quiero que se descargue un archivo pero no me funciona.

el código que tengo es :
echo '<a href="file://'.$row_rs['manual'].'">'.LANG_DOWNLOAD_MANUAL.'</a>';

gracias por la ayuda
  #2 (permalink)  
Antiguo 13/03/2010, 17:01
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 15 años
Puntos: 19
Respuesta: Dercargar achivos.

file:// no es un protocolo de descarga. file:// es un protocolo para acceder a los archivos del ordenador.

Pon http://

Si luego quieres que se descargue tienes que ya ver algo más de PHP.


De todos modos, por el momento, esto no es PHP.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #3 (permalink)  
Antiguo 13/03/2010, 17:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 27
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Dercargar achivos.

No me he explicado bien.

La cuestión es como vinculo el link con la descarga. (En principio ya tengo estas funciones con información del foro)
  #4 (permalink)  
Antiguo 13/03/2010, 19:08
Avatar de yeudiel  
Fecha de Ingreso: abril-2008
Ubicación: Ciudad de México
Mensajes: 78
Antigüedad: 16 años
Puntos: 1
Respuesta: Dercargar achivos.

Parece que sigues sin explicarte bien, puedes hacer un a href a un archivo, pero si a este le pones el protocolo file://, estas indicando la ruta de un archivo EN LA COMPUTADORA CLIENTE, osea en su disco duro, para realizar una descarga por internet necesitas obligatoriamente usar ftp:// http://, a lo q el link deberia quedar asi, suponiendo q la ruta del archivo la estes obteniendo de una variable en php

Código PHP:
<?php
echo '<a href="http://'.$row_rs["manual"].'" >'.LANG_DOWNLOAD_MANUAL.'</a>';
?>
Suerte
  #5 (permalink)  
Antiguo 13/03/2010, 19:16
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Dercargar achivos.

simplemente si el archivo esta accesible en el DOCUMENT_ROOT solo tienes que colocar la ruta relativa a éste y el usuario lo podrá descargar, en cambio si el archivo esta fuera del document_root, necesitas readfile y modificar el header para volcarlo a la salida, el tipico force-download: http://www.ryboe.com/tutorials/php-h...force-download
  #6 (permalink)  
Antiguo 14/03/2010, 18:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 27
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Dercargar achivos.

Muchas gracias a todos.

Tengo
<?php
echo '<a href="http://'.$row_rs["manual"].'" >'.LANG_DOWNLOAD_MANUAL.'</a>';
?>

Pero no descarga.
El archivo esta en un subdirectorio /manuales

He cogido el codigo para forzar la descarga pero no se como vincular la funcion con el link.

Siento este tipo de preguntas pero es que solo llevo un par de semanas con el tema web y php.

gracias
  #7 (permalink)  
Antiguo 15/03/2010, 05:37
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 15 años
Puntos: 19
Respuesta: Dercargar achivos.

Te manda una página no existente (Error 404)? Eso es que lo has puesto mal. Si te manda un error de permiso (Error 403) entonces es que no tienes permisos para acceder a ese archivo. Se soluciona en PHP con chmod(arhcivo, 777);

Si luego lo que quieres es que se descargue si o si, aunque sea un txt (que el navegador intentará abrir), entonces ya es algo avanzado. Tienes que conocer headers, y o bien usas apache y su mod_rewrite, o bien lo haces de la forma no-user-friendly que es más facil pero tienes que cambiar todos los enlaces.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #8 (permalink)  
Antiguo 16/03/2010, 14:40
 
Fecha de Ingreso: marzo-2010
Mensajes: 73
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Dercargar achivos.

yo he probado este codigo, aunq a mi no me funciona, es el unico q encuentro por ahi...
esto que pongo a continuaion, lo podrias pegar en un documento descarga.php, por ejemplo


Código:
<?php /* Abrimos código PHP */ 
$archivos = array("ele.doc"); /* Declaramos una variable llamada archivos, la cual será un array que en su interior contendrá los nombres de todos los archivos que será posible descargar desde nuestro sitio, con sus respectivas extensiones */ 

$f = $_GET["f"]; /* En una variable f , recogeremos un parámetro por URL que enviaremos desde la página donde se quiere realizar la descarga */ 

if(!in_array($f,$archivos)) /* Definimos otro if y como condición usamos la función de PHP in_array la cual nos indica si cierto valor existe en un determinado array. Nosotros comprobaremos si el parámetro recogido por URL (el archivo que se intenta descargar) está definido dentro del array archivos. De esta forma evitamos que se intenten descargar archivos que no se encuentren definidos ahí y así evitamos problemas de seguridad */ 
{ 
die("ERROR! Usted no cuenta con los permisos para descargar $f"); /* Si el archivo no estaba definido en el array, detenemos la ejecución del código y desplegamos un mensaje de error */ 
} 
header("Content-type: application/octet-stream"); /* Definimos los headers necesarios para la descarga */ 
header("Content-Disposition: attachment; filename=\"$f\"\n"); /* Igual a la línea anterior, definiendo según el parámetro recogido en $f */ 

$fp=fopen("$f", "r"); /* En la variable $fp abrimos, mediante la función fopen, el archivo correspondiente al parámetro almacenado en la variable $f y lo abrimos en modo lectura, o sea “r” */ 

fpassthru($fp); /* Con fpassthru imprimimos y enviamos el archivo que abrimos en la variable $fp */ 
?>

luego, desde el sitio desde el que quieras que se descargue, incluir el codigo

Código:
<form action="descargaEjs.php?f=ele.doc" method="get" name="nada" id="nada">
<INPUT TYPE=IMAGE SRC="imagenes/rar.gif" align="middle">
o un href. si te funciona, estupendo, pero si qalguien pudiera decirme por q a mi no...
seria de agradecer!!
  #9 (permalink)  
Antiguo 16/03/2010, 15:57
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 15 años
Puntos: 19
Respuesta: Dercargar achivos.

En que sentido no te funciona?

Desde aquí te digo 2 cosas, la primera que no lo estás cerrando, la segunda que has habierto en modo texto y la cuarta, que si pesa mas de un tamaño determinado puede bloquearse PHP.

Código PHP:
Ver original
  1. $archivos = array("ele.doc");
  2. $f = $_GET["f"];
  3. if(!in_array($f,$archivos))  die("ERROR! Usted no cuenta con los permisos para descargar $f");  
  4. header("Content-type: application/octet-stream");
  5. header("Content-Disposition: attachment; filename=\"$f\"\n");
  6. $fp=fopen("$f", "rb");
  7. while(!feof($fp)) echo fread($fp,10*1024);
  8. flclose($fp);

A ver si esto funciona.

Cita:
uego, desde el sitio desde el que quieras que se descargue, incluir el codigo

Código:

<form action="descargaEjs.php?f=ele.doc" method="get" name="nada" id="nada">
<INPUT TYPE=IMAGE SRC="imagenes/rar.gif" align="middle">

o un href. si te funciona, estupendo, pero si qalguien pudiera decirme por q a mi no...
seria de agradecer!!
No se como hacer esto, pero se me ocurre que con javascript.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it

Última edición por AnesGy; 16/03/2010 a las 17:07
  #10 (permalink)  
Antiguo 16/03/2010, 16:46
 
Fecha de Ingreso: marzo-2010
Mensajes: 73
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Dercargar achivos.

Contesto aqui entonces :)
Ahora con tu codigo, sale el error
ERROR! Usted no cuenta con los permisos para descargar

El problema no es el peso., ya q es un documento de prueba que no ocupa 9Kb.
Al salir ese error, deduzco que es como si no recibiera bien el nombre del arqchivo??

Como podria solucuionar esto??

Y si quisiera forzar ladescarga de archivos pesados, como se realizaria??

Con que no funciona me refiero a q no se descarga el archivo ele.doc, sino descarga.php

Muchas gracias igual!
  #11 (permalink)  
Antiguo 16/03/2010, 17:06
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 15 años
Puntos: 19
Respuesta: Dercargar achivos.

Si no te deja es por que el archivo a descargar no está en la lista que el dueño del post especificó. Para lo que tu quieres quita las tres primeras líneas del código ese que puse.

De todas maneras yo no paso como default el Content-Type de aplication/octet... suelo pasar el Content-Type que es, y luego fuerzo la descarga.

Por último, Había una errata en mi código al cual sin querer le borré una C de Content Disposition, ya está arreglado.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #12 (permalink)  
Antiguo 16/03/2010, 17:07
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Dercargar achivos.

¿La variable $row_rs['manual'] tiene la ruta completa al archivo, o es simplemente un archivo.ext?

Quizá te falta parte de la ruta...
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #13 (permalink)  
Antiguo 16/03/2010, 17:10
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 15 años
Puntos: 19
Respuesta: Dercargar achivos.

Es la ruta al archivo, pero ya discutimos que no era file:// y todo eso y ahora estamos con el código que modifica los headers.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it

Etiquetas: Ninguno
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 14:58.