Foros del Web » Programando para Internet » PHP »

Almacenar archivo (lado cliente)

Estas en el tema de Almacenar archivo (lado cliente) en el foro de PHP en Foros del Web. Estoy trabajando con un upload de archivos y su descarga (PHP y mysql) y mi problema es q cuando eligo el archivo a descargar no ...
  #1 (permalink)  
Antiguo 18/05/2005, 15:46
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Almacenar archivo (lado cliente)

Estoy trabajando con un upload de archivos y su descarga (PHP y mysql) y mi problema es q cuando eligo el archivo a descargar no me muestra esa ventanita de descarga de archivos que me pregunta si deseo abrir el archivo o guardarlo. Lo q sucede es q abre la imagen en una nueva ventana y no se supone q sea así, sino q me muestre esa ventanita para elegir la ruta donde deseo almacenarla jeje.
Todo este proceso es local osea q no tengo mi página en ningun servidor.

salu2
  #2 (permalink)  
Antiguo 18/05/2005, 16:23
 
Fecha de Ingreso: noviembre-2003
Ubicación: Veracruz
Mensajes: 131
Antigüedad: 14 años, 1 mes
Puntos: 0
Que extension de archivo manejas??
Yo utilizo esta para descargar archivos txt y me funciona muy bien...

Código PHP:
header('Content-type: application/txt');
header('Content-Disposition: attachment; filename="Equipos.txt"');
readfile('Equipos.txt'); 
Espero te sirva...
Saludos
  #3 (permalink)  
Antiguo 18/05/2005, 17:34
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
mmmm....

sabes??, para empezar aun no c utilizar muy bien las cabeceras HTTP, de hecho... no las utilizo. Lo único q manejo son mis links con la dirección del archivo y ya jeje. Hasta ahorita he probado solo con imagenes (.gif y .jpg) aun no con archivos de texto. Mi link de deskrga es este:

Código HTML:
<a href="<?=$servidor.'/'.$nombre?>">DESCARGAR</a></center></td> 

Me recomendaron utilizar las cabeceras HTTP pero no c como, si me pudieras ayudar con esto te lo agradeceria....

Salu2
  #4 (permalink)  
Antiguo 18/05/2005, 18:46
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 13 años, 11 meses
Puntos: 2
Podrías usar algo así para forzar al browser
Código PHP:
// Cabezeras para forzar al navegador a guardar el archivo
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
header("Content-type: application/force-download");
header("Content-Disposition: attachment;mi_archivo=img.jpg"); 
Saludos cuidate
__________________
Dios dira que esto no es justo, pero lo sera...
  #5 (permalink)  
Antiguo 18/05/2005, 20:26
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Y mi link como quedaria???

Pues he tratado de implementar el código sugerido en mi aplicación pero.. no me sale. Lo q hago es esto:

Código PHP:
//archivos.php
function mostrarTemplate($tema, $variables,$servidor)
{
        //var_dump($variables);
        extract($variables,$servidor);
        eval("?>".$tema."<?");

}
$url = $_SERVER['SCRIPT_FILENAME'];
$rutaserver = dirname($url);
$sql = "
SELECT FROM rutas";
$rs = mysql_query($sql);
if(mysql_num_rows($rs)>0){
        echo "
Cantidad de registros" . mysql_num_rows($rs) . "<br><br>";
         $template = implode("", file('pagdescarga.html'));
         while($row = mysql_fetch_assoc($rs)) {
         mostrarTemplate($template, $row,$rutaserver);
         }
}
Código HTML:
<!--pagdescarga.html-->
<?php
$enlace = $servidor.'/'.$nombre; //$nombre es el campo en la B.D  
header ("Content-Disposition: attachment; filename=".$nombre."nn");
header ("Content-Type: application/octet-stream");
readfile($enlace);
?>....................
<a href="<?=$servidor.'/'.$nombre?>">DESCARGAR</a> 
Se q esta demasiado incoherente mi código (en "pagdescarga.html") pero es q ya no me llegan más ideas para crear mi enlace.

OK.. lo q hago es ésto: En "archivos.php" genero mi consulta a la B.D para jalar todos los datos de mis archivos. Estos datos se muestran en "pagdescarga.html" (todos mis archivos, imagenes..etc) pero así como les muestro mi código de ésta me genera muchos errores.

El código de los encabezados está mal, no c como deberia de ser y pues con esto mi enlace es erroneo (más no me causa problemas pero así como esta me sigue mostrando la imagen en otra página), so..Cómo deberia de ser mi link?? (mi link no me genera los errores, sino el código d los encabezados) ja !.. espero haberme explicado.

Última edición por Ultra Violeta; 18/05/2005 a las 20:41
  #6 (permalink)  
Antiguo 19/05/2005, 11:53
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
toc toc ???

Alguien q me ayude???????????
  #7 (permalink)  
Antiguo 19/05/2005, 13:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Código PHP:
<!--pagdescarga.html-->
<?php
$enlace 
$servidor.'/'.$nombre//$nombre es el campo en la B.D  
header ("Content-Disposition: attachment; filename=".$nombre."nn");
header ("Content-Type: application/octet-stream");
readfile($enlace);
?>....................
<a href="<?=$servidor.'/'.$nombre?>">DESCARGAR</a>
Eso no es correcto .. No sé si comprendes que hacen las "cabeceras HTTP" que estás usando .. pero si no es así te explico un poco por encima (por qué sino no harás mas que probar y probar sin resultados):

Cara a un "navegador" .. el contenido que se le envia a este .. vía esas "cabeceras HTTP" se le indica de que tipo es para que -en consecuencia- lo interprete; si tu generas una página HTML por defecto le estás diciendo a tu navegador "oye .. te envio HTML para que lo interpretes" .. si envias una imagen .. lo mismo (y si lo quieres "mezclar" entre el "HTML" .. en algún punto usas un tag de imagen: <img src="...."> .. y por ahí se le ha de indicar "esto son datos de tipo tal .. (formato MIME)).

Cuando tu quieres "forzar" un archivo para descargar .. para que se te "abra" esa ventanita típica para descargar el archivo .. lo que haces es "componer" las cabeceras HTTP adecuadas para tal fin. Estas son las que ahí usas (en el ejemplo que te destaco) .. Para este efecto, todo "HTML" está de más .. no puedes usarlo, empezando por "comentarios" .. ni un "link" para descargar en ese mismo script .. en tal caso deberías usar un script/página HTML común con un link que apunte a tu script.php de descargas donde tal vez le pases el parámetro de que archivo se descargará (una referencia de un "ID" de alguna BD donde obtienes el nombre del archivo .. etc o directo el archivo en sí por su nombre).

De lo dicho .. en tu script que obtengas los nombres de los archivos a descargar (o identificadores que corresponda) debes generar "HTML" con un link que apunte a tu Script de descarga que NO contiene nada de HTML .. sólo esas cabeceras HTTP:

Un link tipo:
Código PHP:
<a href="descargar.php?nombre=<? echo $nombre ?>">descargar <? echo $nombre ?></a>
y descargar.php recibirá ese "nombre" o identificador de tu variable que llamará a tu archivo .. Lo ideal es que hagas cosas tipo:

descargar.php?id=1 .. y en "descargar.php" hagas una consulta SQL a tu BD para obtener el campo de tu BD del registro "id=...." para obtener el nombre del archivo a descargar .. Así en ningún momento "desvelas" donde está el archivo, ni su nombre ni otros detalles del mismo.

Un saludo,
  #8 (permalink)  
Antiguo 19/05/2005, 19:20
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
hasta ahora entendido pero...

Grax por la explikdota, t entendí todo perfectamente. Respecto a las cabeceras si habia seguido tu recomendación y lei la documentación de estas pero no comprendí bien sobre como implementarla más si cual era su función, grax x eso también.
Como t mostre arriba tengo mi página de descargas "pagdescarga.html" donde tengo todos mis links para realizar la descarga, pero...
cómo le indico al script "descarga.php" (donde tengo mis cabeceras) q el link q seleccionarón corresponde al registro tal con clave tal?????...ésto para realizar mi consulta a la b.d y recoja los datos correspondientes al archivo linkeado. cómo paso esos parámetros??

Código HTML:
<!--pagdescarga.html-->
..<?=$fecha?>...<?=$nombre?>....<?=$tamaño?>...
<a href="descargar.php?nombre=<? echo $nombre ?>">descargar <? echo $nombre ?> <!--desde aquí pasar el parámetro para generar la consulta--> 
Código PHP:
//descarga.php
$url $_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$sql "SELECT * FROM rutas WHERE id=$clave"//aquí me quedo incompleta
$rs mysql_query($sql);
$enlace $rutaserver.'/'.$nombre;
header ("Content-Disposition: attachment; filename=".$nombre."nn");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace); 
Salu2

Última edición por Ultra Violeta; 19/05/2005 a las 19:36
  #9 (permalink)  
Antiguo 20/05/2005, 08:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Esa página de descargas ... si obtienes tus datos de una consulta a tu BD .. para comenzar ya no puede ser .html .. debe ser .php (tal vez tu interpretes .html como .php?)

El link que debes generar para descargar.php (donde están esas cabeceras) será tipo:
descargar.php?id=1 o similar .. Realmente no sé bajo que parámetro identificas el archivo que quieres descargar o lo piensas hacer .. pero se necesita algo:

Si tu tienes tu tabla de tu BD: "rutas" y bajo ese "ID" (o que estructura tiene esa tabla?) quieres obtener la "ruta" .. pues deberías hacer una consulta SQL tipo:

Código PHP:
$sql "SELECT nombre FROM rutas WHERE id='".$_GET['id']."'"//aquí me quedo incompleta 
$rs mysql_query($sql); 
$nombre=mysql_result($rs,"nombre"); 
Un saludo,
  #10 (permalink)  
Antiguo 20/05/2005, 13:02
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
No, no interpreto .html como .php.. pero no c en si q problemas me podría causar si es html cuando, únicamente lo q hago son mostrar los datos generados de la consulta en "archivos.php", hasta ahorita no me ha causado problemas eso.. pero, osea q con el único hecho de q maneje php en html mi archivo ya debe de ser extension .php??? pero ahi t va como estoy haciendo esto.. tengo 3 archivos:

"archivos.php" -> En este hago una consulta a la B.D y muestro todos mis archivos en...
"pagdescarga.html" -> Aquí c muestran todos mis archivos, y para su descarga utilizo....
"descarga.php" -> Aquí es donde estan todas mis cabeceras y donde nuevamente hago otra consulta (específica) a la B.D para descargar el archivo correspondiente al link seleccionado en "pagdescarga.html"

Ahora lo q no c como funciona es el paso de un parámetro..el "id" de "pagdescarga.html" a "descarga.php" para utilizarlo en la consulta, o sea, si tengo en ...
Código PHP:
//"pagdescarga.html"
"descarga.php?nombre=<? echo $nombre ?> // mi link
qué contiene en mi consulta esto??....
Código PHP:
//"descarga.php"
............$_GET['id'//se supone q la clave, pero de dónde tomo el valor?? 
Espero me tengas pasiencia, soy nueva en ésto y ando aprendiendo en la marcha.. grax

salu2
  #11 (permalink)  
Antiguo 20/05/2005, 13:14
Avatar de Gabriel0702  
Fecha de Ingreso: febrero-2005
Mensajes: 155
Antigüedad: 12 años, 9 meses
Puntos: 0
Cita:
Iniciado por Ultra Violeta
Ahora lo q no c como funciona es el paso de un parámetro..el "id" de "pagdescarga.html" a "descarga.php" para utilizarlo en la consulta, o sea, si tengo en ...
Código PHP:
//"pagdescarga.html"
"descarga.php?nombre=<? echo $nombre ?> // mi link
qué contiene en mi consulta esto??....
Código PHP:
//"descarga.php"
............$_GET['id'//se supone q la clave, pero de dónde tomo el valor?? 
Espero me tengas pasiencia, soy nueva en ésto y ando aprendiendo en la marcha.. grax

salu2
cuando mandas una variable con este tipo: descarga.php?nombre=algo

la lees de tu página destino como $_GET['nombre']; y el valor será algo

espero que esa sea tu duda y que esté resuelta ya.
  #12 (permalink)  
Antiguo 20/05/2005, 13:27
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
oooorale...q rápido, grax

grax.. si esa era mi duda, pero sabes??? ahora esto me da un chorro de errores...los errores son estos....

Warning: mysql_result(): supplied argument is not a valid MySQL result resource in F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php on line 6

(en mi linea 6 tengo esto $nombre=mysql_result($rs,"nombre"); , según el error aqui arribita esta mal )

Warning: Cannot modify header information - headers already sent by (output started at F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php:6) in F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php on line 8

Warning: Cannot modify header information - headers already sent by (output started at F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php:6) in F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php on line 9

Warning: Cannot modify header information - headers already sent by (output started at F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php:6) in F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php on line 10

Warning: readfile(F:/Archivos de programa/Apache Group/Apache2/htdocs/upload_php/): failed to open stream: Permission denied in F:\Archivos de programa\Apache Group\Apache2\htdocs\upload_php\descarga.php on line 11

Última edición por Ultra Violeta; 20/05/2005 a las 13:33
  #13 (permalink)  
Antiguo 20/05/2005, 15:01
Avatar de Gabriel0702  
Fecha de Ingreso: febrero-2005
Mensajes: 155
Antigüedad: 12 años, 9 meses
Puntos: 0
lo más probable es que no tengas un campo llamado nombre en tu $rs, qué tal si pones tu código actual desde lo que le pones a tu $rs, hasta la línea 11?
  #14 (permalink)  
Antiguo 20/05/2005, 17:49
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
si.. lo tengo todo, es lo peor del caso jeje

ésto es lo que tengo...
Código PHP:
<?php
$url 
$_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$sql "SELECT * FROM rutas WHERE nombre='".$_GET['nombre']."'";
$rs mysql_query($sql);
$nombre=mysql_result($rs,"nombre");
$enlace $rutaserver.'/'.$nombre;
header ("Content-Disposition: attachment; filename=".$nombre."nombre");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
?>
q dices??

salu2
  #15 (permalink)  
Antiguo 21/05/2005, 09:21
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Toc Toc................

Alguien X Ahi Q Me Ayude????????
  #16 (permalink)  
Antiguo 21/05/2005, 10:04
Avatar de Gabriel0702  
Fecha de Ingreso: febrero-2005
Mensajes: 155
Antigüedad: 12 años, 9 meses
Puntos: 0
Se me ocurre que puedes hacer esto:

Cita:
Iniciado por Ultra Violeta
ésto es lo que tengo...
Código PHP:
<?php
$url 
$_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$sql "SELECT * FROM rutas WHERE nombre='".$_GET['nombre']."'";
$rs mysql_query($sql);
$nombre=mysql_result($rs,"nombre");
$enlace $rutaserver.'/'.$nombre;
header ("Content-Disposition: attachment; filename=".$nombre."nombre");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
?>
q dices??

salu2
Mira, lo que yo hago en ese tipo de situaciones es comprobar si la sintáxis de la consulta está correcta, para eso, hago lo siguiente:

Código PHP:
<?php
$url 
$_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$sql "SELECT * FROM rutas WHERE nombre='".$_GET['nombre']."'";
echo 
"Consulta: $sql";

/*$rs = mysql_query($sql);
$nombre=mysql_result($rs,"nombre");
$enlace = $rutaserver.'/'.$nombre;
header ("Content-Disposition: attachment; filename=".$nombre."nombre");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);*/
?>
después copio el código de la consulta y lo checo en phpMyAdmin, si te marca un error, entonces se tiene que corregir la consulta, eso es con lo que respecta al primer error, ojalá que te sirva.
  #17 (permalink)  
Antiguo 21/05/2005, 13:14
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
jeje me acabo de dar cuenta de algoo.....

Que no necesito realizar ninguna colsulta. X q con solamente utilizar $_GET['nombre'] se a q archivo me estoy refiriendo pero ahora tengo otro problema.....Hago ésto:

Código PHP:
<?php
$url 
$_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$nombre $_GET['nombre'];
$enlace $rutaserver.'/'$nombre;
header ("Content-Disposition: attachment; filename="$nombre);
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
Descargo mi archivo pero a la hr de abrirlo me da los siguientes errores:

<br />
<b>Warning</b>: filesize(): Stat failed for F:/Archivos de programa/Apache Group/Apache2/htdocs/pagina web/MANUALES ADMINISTRATIVOS.doc (errno=2 - No such file or directory) in <b>F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\up_descarga.php</b> on line <b>12</b><br />
<br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\up_descarga.php:12) in <b>F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\up_descarga.php</b> on line <b>12</b><br />
<br />
<b>Warning</b>: readfile(F:/Archivos de programa/Apache Group/Apache2/htdocs/pagina web/MANUALES ADMINISTRATIVOS.doc): failed to open stream: No such file or directory in <b>F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\up_descarga.php</b> on line <b>13</b><br />


X q me da estos errores??? Hay q aclarar algo..

--En esta direccion guardo mis archivos a descargar:
F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\archivos_upload\archivo.doc

--Y en esta esta mi script:
F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\script.php

Salu2
  #18 (permalink)  
Antiguo 21/05/2005, 13:48
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 13 años, 11 meses
Puntos: 2
Cita:
--En esta direccion guardo mis archivos a descargar:
F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\archivos_upload\archivo.doc

--Y en esta esta mi script:
F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\script.php
Si vas a usar $_SERVER['SCRIPT_FILENAME'], el script debe estar en la misma carpeta q los archivos a descargar. Si le haces un echo a la $variable q contiene el SCRIPT_FILENAME, de dara como rtado "F:\Archivos de programa\Apache Group\Apache2\htdocs\pagina web\script.php" y desde ahí intenta descargar tus archivos, algo q no encuentra. mueve el script a la carpeta donde tienes lo archivos a descargar y modifica el link con el q llamas al script (<a href...>)
Saludos Cuidate
P.D.: No se si el código tiene otro error, solo leí al golpe de vista eso y te lo digo, cualquiera seguí posteando.
__________________
Dios dira que esto no es justo, pero lo sera...
  #19 (permalink)  
Antiguo 21/05/2005, 14:46
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
por fin!!!!

Pues ahora si ya funciona, ya tengo mi descarga de archivos. Y si, mi problema era q tenia en una carpeta mis archivos y en otra mi script de descarga. Gracias... Aqui les muestro como quedo finalmente:
Código PHP:
// así queda mi link en "up_pagdescarga.php"
<?php
.........
<
a href="archivos_upload/up_descarga.php?nombre=<? echo $nombre ?>">
........
?>
y así mi código para la descarga:

Código PHP:
<?php
// "up_descarga.php"
//Este fue el script q tuve q mover a la carpeta donde están
//todos mis archivos que deseo descargar.
$url $_SERVER['SCRIPT_FILENAME'];
$rutaserver dirname($url);
$nombre=$_GET['nombre'];
$enlace $rutaserver.'/'.$nombre;
header ("Content-Disposition: attachment; filename=".$nombre);
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
?>
Espero le funcione a alguien q haya el mismo problema... gracias!

Salu2
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:16.