PDA

Ver la Versión Completa : Bajar un fichero


obiwuan
18-09-2003, 20:20:13
Mi primer post en este foro.

Tengo un fichero en el servidor que, mediante un botón quiero bajar a mi disco duro.

He estado buscando en la documentación de http://es2.php.net/manual/es/index.php y he encontrado el comando copy($source, $dest). Pero este comando me dice: "Warning: Unable to create 'c:/urls.txt': No such file or directory in /home/virtual/.../php/urls.php on line 41", o sea, que está intentando copiar sobre el propio HD del servidor. A mi me interesa bajarlo a mi disco duro.

¿Alguien sabe cómo se hace?

roman
18-09-2003, 21:12:24
Esta parece pregunta de javascript:

<input type='button' value='bájalo' onclick='location.href="tu archivo"'>

Ahora que sí insistes en php podría ser:

<input type='button' value='bájalo' onclick='bajalo.php'>

El archivo bajalo.php contendría:


header('location: tu archivo');


// Saludos

obiwuan
18-09-2003, 23:18:22
Vaya, Gran Señor de Teotihuacán, probaré esto y comentaré. Esto quiere decir que: ¿nos falta un foro de javascript? ¿o lo dejamos en éste?, ¿o es el de java? Como nunca antes había entrado en esta sección pues no lo sé.

Gracias (sirva como respuesta a los dos temas)

kayetano
22-09-2003, 12:07:58
Hola

Nunca habias entrado en esta seccion ??? .... no se a mi como que me suenas de algo.

Otra opcion algo mas currada y que sirve para ocultar la situacion del archivo, seria la siguiente:


header( "Content-Type: ".$tipo );
header( "Content-Length: ".$tamano );
header( "Content-Disposition: filename=".$nombre_fichero );
passthru("cat '".$capeta."/".$nombre_fichero."'");


De esta forma puedes ocultar la localizacion real del archivo, modificar su nombre y alguan que otra cosa mas que ahora no se me ocurren.

obiwuan
22-09-2003, 14:06:25
Hey, esta última me gusta más, ya que no se trata de un fichero de dominio público sino privado, y con el método de román hago público todo el path del fichero.

PD: en caso de ser un fichero a descargar por cualquiera, sí que lo hubiera hecho con un link, tal y como tengo en la sección de descargas. Pero no es eso lo que yo quiero.

Gracias kayetano.

obiwuan
23-09-2003, 20:00:59
Después de varias pruebas, el método que he tenido que utilizar es el proporcionado por román. Lo único que pasa es que no es exactamente lo que yo quería puesto que ese método lo que te abre es una ventana del navegador con el contenido del fichero, luego tienes que darle al navegador en la opción "guardar como..." y yo lo que pretendía es que se guardara directamente en el disco duro, sin mostrarse el contenido en pantalla.

Se trata de un fichero TXT, que puede llegar a ser muy grande. De momento he empleado este método.

La opción de poner un link no me es útil ya que en este caso, como algún buscador apunte a dicho fichero, puedo organizar un cacao en los buscadores impresionante. Además, este fichero está protegido por contraseña, si pongo el link, pierdo la contraseña.

Bueno, gracias por la ayuda. Seguiré probando.

roman
23-09-2003, 21:27:57
El hecho de que sea un archivo TXT es lo que ocasiona que el navegador lo despliegue en lugar de bajarlo.

Aquí te pongo un truco que parece funconar como deseas.

Vamos a suponer que tu archivo se llama "obiwuan.txt".

En la página desde donde deseas bajar el archivo pones un enlace (o botón si deseas confirmación) al script "obiwuan.php". En este script pones:


<?
header("Content-Type: text/html/force-download");
header("Content-Disposition: filename=obiwuan.txt");
include(obiwuan.txt');
?>


force-download obliga al archivo a bajarse (en este caso "obiwuan.php") Esto es necesario para que el include no se ejecute y te lo despliegue en el navegador.

El segundo header establece el nombre del archivo. Si no pones nada el archivo se bajará como "obiwuan.php" y no como "obiwuan.txt"

¡Listo! Cuando el usuario haga click aparecerá directamente la ventana de guardar archivo.

Además, lo bueno es que con "include" puedes bajar un archivo que coloques en carpetas fuera del árbol de documentos del servidor de manera que queda más protegido y de hecho puedes forzar el nombre que quieras, no tiene que coincidir con el real.

// Saludos

obiwuan
23-09-2003, 23:12:27
Esto es lo que he puesto:

if ($boton=="Descargar") {
header("Content-Type: text/html/force-download");
header("Content-Disposition: filename=este.txt");
include ('este.txt');
exit;
}
y lo que ocurre es lo siguiente:

Netscape: ¡perfecto!
IE: descarga sin preguntar nombre, ni siquiera sé dónde lo mete
Opera: muestra el contenido del fichero

¡Menuda sorpresa!

Así que lo tendré que dejar a sabiendas que sólo funciona correcto con el Netscape.

NOTA: El exit es necesario porque el Opera sigue procesando el script, y hay mucho más que eso en la página.

Thenk iu, roman

roman
23-09-2003, 23:35:50
¿Con qué versión de IE lo probaste? Con la versión 6 funciona. En la página de PHP mencionan algunos problemas con IE en la versión 5. No sé si tenga mucho que ver pero prueba agregar el header:

header("Cache-control: private");

También prueba cambiando el header de "Content-dispositon" a

header("Content-Disposition: attachment; filename=este.txt");

y quita el de force-download.

// Saludos

kEpEx
01-08-2007, 18:34:26
Estos son los headers que deben de llevar para descargar la actual pagina como un txt.


header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"nombre-archivo.txt\"");


Se debe recordar que los saldos de linea para windows son: "\n\r" y no html ni solo \n

Tambien si se tiene algun otro archivo en otra parte que se quiere descargar por medio de ese script, se envian los mismos headers de arriba (poniendo el nombre y la extencion del archivo correctos en vez de .txt)

readfile($ruta-al-archivo);


Esto es muy util cuando se valida el permiso de ciertos usuarios a descargar archivos, asi no se muestra la ruta del archivo, si no que siempre el script es la ruta, por ejemplo download_file.php?id=332

Espero les sirva.

http://keflog.com
http://keflog.com/sex

kayetano
15-08-2007, 18:16:39
Hola

¿Te has parado a mirar de cuando es ese post? ;)

kEpEx
15-08-2007, 22:16:47
Claro,

Pero este foro se encuentra dentro de los primeros cuando buscas el correcto keyword en google.

Entonces, toda esa gente que entra como yo, aun busca la pregunta.

No me preocupo por los autores de eso, si no por dejar la informacion correcta alas personas que siguen entrando.

Creo que si se la respuesta, y estoy viendo que ahi, lo ultimo que dejaron es algo incorrecto, lo mejor es que lo diga. Espero ayudar a gente que lo necesite.

Porcierto, visita mi webpage: http://keflog.com

Saludos

kayetano
16-08-2007, 15:41:04
Hola

Con el tema de la fecha quiero dar a entender que es muy posible que durante los últimos 4 años se haya tratado este tema en otros hilos proporcionando nuevas y mejores respuestas, por ponerte un ejemplo:
http://www.clubdelphi.com/foros/showthread.php?t=28945
http://www.clubdelphi.com/foros/showthread.php?t=34897
http://www.clubdelphi.com/foros/showthread.php?t=21189
http://www.clubdelphi.com/foros/showthread.php?t=44467
En estos hilos (algo mas actuales) se trató el mismo tema, o parecido, y se propusieron diferentes soluciones, entre ellas la que tu propones en un hilo de 2003.

Estoy de acuerdo en que si buscas en google por una palabra clave es muy posible que te aparezca este u otro hilo del clubdelphi (somo los mejores ;)), pero siempre es mejor que hagas uso de la herramienta de búsqueda de clubdelphi en la que posiblemente te aparecerán respuestas más actuales con soluciones más modernas y depuradas.

De todas formas se agradece mucho tu colaboración y espero poder verte más a menudo por el foro ayudando y dando soluciones a todos los foristas.

kEpEx
16-08-2007, 16:44:30
muchas gracias :)

La verdad no suelo ser muy activo en los foros, solo cuando pregunto..

Pero cuando me encuentro con algo, en donde yo se la respuesta y alguna vez me encontre buscandola.. pues ahi le escribo contundentemente.. sin dudas..

pero bueno, gracias por la invitacion.

y que bueno que esten al tanto de los movimientos de su sitio.. por eso son e los mejores :)

Saludos