Foros del Web » Programando para Internet » PHP »

Script forzar descarga no funciona

Estas en el tema de Script forzar descarga no funciona en el foro de PHP en Foros del Web. Hola todos. Tengo este codigo Código: <? session_start(); include ("includes/seguridad.php"); require("../privado/php/configuracion.php"); $ref=$_GET["ref"]; $SQL="SELECT Archivo FROM apuntes WHERE Referencia='$ref'"; $con=mysql_query($SQL) or die (mysql_error()); $referencia=mysql_fetch_array($con); $enlace = ...
  #1 (permalink)  
Antiguo 10/10/2006, 05:55
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
Script forzar descarga no funciona

Hola todos.

Tengo este codigo

Código:
<? session_start();
include ("includes/seguridad.php"); 

require("../privado/php/configuracion.php");
$ref=$_GET["ref"];
$SQL="SELECT Archivo FROM apuntes WHERE Referencia='$ref'";
$con=mysql_query($SQL) or die (mysql_error());
$referencia=mysql_fetch_array($con);

$enlace = "../privado/docs/".$referencia ["Archivo"];
header ("Content-Disposition: attachment; filename=".$referencia ["Archivo"]."\n\n");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
?>
Pero no consigo que descarge los ficheros. Se me abre una ventana del navegador y un monton de caracteres ilegibles

¿Ayuda?
  #2 (permalink)  
Antiguo 10/10/2006, 07:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Usa session_write_close(); despues de tu include "seguridad.php" donde supongo que harás uso de alguna variable de sesión ...

El comentario viene de otro comentario de php.net:

Cita:
bkatz at usefulengineering dot com
16-Jul-2005 11:05
session_write_close() worked as a lifesaver for me when automatically uploading files to a user (forcing a download instead of a link). If files are large, and since session_start() does not allow another page using session_start() to proceed until it's done, i was not able to upload more than one file at a time. By using session_write_close() before beginning the file upload, my users can now download as many big files as they like, at the same time. Example:

Código PHP:
<?
session_start
();
/* Do session stuff here; security; logging; etc. */
session_write_close();
/* NOW write out the requested file. */
header("Content-type: audio/x-mpeg"); /* or whatever type */
header("Content-Disposition: attachment; filename=" $filename); 
header("Content-Length: " $filesize);
header("Content-Transfer-Encoding: binary\n\n");
header("Pragma: no-cache"); 
header("Expires: 0"); 
$file_contents file_get_contents($filepath);    
print(
$file_contents);
?>
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 10/10/2006, 08:07
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
sigo teniendo el mismo problema.
Los ficheros son pdf, jpg, doc, zip

EStoy probando con Firefox, IE y Opera

Es posible que sea cosa de los navegadores?????

Llevo 3 horas buscando y leyendo documentación y todos los script parecidos que he encontrado utilizan las misma cabeceras + o -...

No entiendo. esto es lo que me aparece:


PK²Z5¤Á_ƒ#‡I‹mapa_empresa.jpg”¼ePd=·Úxã4 îÓ@ãîÎàî»Îàîîîëàƒ»ŒÜyßïœSß­û릫wíJ:ëYÏJ²² ²;;¾ýÙ`ÈJÊH ³¿ÀŸ HÜÝÔÖ€’³®h"fŽ&æ³þ¿9P6!X˜Òß+,<ìß/,,ˆDü›€HH(ÿ¤¿WTTÐ? ûÿ,ˆŽ„„Ž†††ýÿ;ý退ÐÙ0ßa @h

Última edición por Operadormail; 10/10/2006 a las 09:29
  #4 (permalink)  
Antiguo 10/10/2006, 10:54
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
es posible que sea problema del hosting??
Estoy probando el script en otro hosting y funciona bien...

¿Puede ser?
  #5 (permalink)  
Antiguo 10/10/2006, 11:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Operadormail Ver Mensaje
es posible que sea problema del hosting??
Estoy probando el script en otro hosting y funciona bien...

¿Puede ser?
Verifica que no tengas algún espacio o salto de línea antes de tu <? .. Por ejemplo algunos servicios de hosting "gratuitos" insertan código (HTML/etc) antes del tuyo que puedas enviar, originando eso un problema.

Podría ser que al "subirlo" te dejastes por ahí un espacio o salto de línea.

Cita:
Es posible que sea cosa de los navegadores?????
Si, .. pero tu ya dices que con los mismos navegadores (clientes) lo has probado en -otros- servidores.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 11/10/2006, 01:58
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
no tengo ningun espacio y el host es de pago.
Me han indicado de la version PHP es la 4.4.2 y que tiene algunas funciones desabilitadas por cuestion de seguridad
¿Podria ser esto?
  #7 (permalink)  
Antiguo 11/10/2006, 06:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
En principio no, pues la función "readfile()" que es la que podría darte problemas hace su trabajo bien: está leyendo tu archivo de donde está y lo está entregando al buffer de salida de PHP.

Si ves esos "códigos raros" .. suele ser por un fallo en las cabeceras HTTP que no se están indicando correctamente.

Lo "raro" es que dices que en un servidor te funciona y en otro no.

----------
De tu código .. de donde sale $enlace ?

Fijate en el ejemplo que te dejé de PHP.net y mira como se tratan las cabeceras (el orden) .. El "Content-type" sería ideal que indiques el que tenga el archivo a descargar .. por ejemplo para un jpg: image/jpeg o el formato MIME del archivo en sí (que tal vez lo almacenas en tu BBDD también junto con otros datos de la imagen?)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 11/10/2006, 06:21
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
He subido el script completo en el otro servidor y tampoco me funciona. Habria subido un script únicamente con las cabeceras html, pero el script completo tampoco me funciona.

He actualizado las cabeceras:

Código:
<? session_start();
include ("includes/seguridad.php"); 
session_write_close(); 

require("../privado/php/configuracion.php");
$ref=$_GET["ref"];
$SQL="SELECT Archivo FROM apuntes WHERE Referencia='$ref'";
$con=mysql_query($SQL) or die (mysql_error());
$referen=mysql_fetch_array($con);

$path = "../privado/docs";
$archivo = $referen ["Archivo"];
$enlace = $path."/".$archivo;

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$archivo.'"');
header ("Content-Length: ".filesize($enlace));
header("Pragma: no-cache"); 
header("Expires: 0");  
readfile($enlace);
?>
$enlace es la ruta hasta el archivo + $archivo.
$archivo sale de la BBDD una vez que comprueba la referencia que toma mediante GET

Última edición por Operadormail; 11/10/2006 a las 06:24 Razón: mas datos
  #9 (permalink)  
Antiguo 11/10/2006, 06:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y como ejecutas ese código?

Lo llamas directamente desde un link? ...

OJO con el "content-type" .. usa el que corresponda al tipo de archivo .. Según parece en tu BBDD almacenas vários típos de archivos diferentes.

Revisa también que en esos archivos que llamas por un "include()" en este otro no tengan ningún espacio ni salto de línea antes de <? o de ?> de sus respectivos códigos.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 11/10/2006, 07:10
 
Fecha de Ingreso: junio-2003
Mensajes: 778
Antigüedad: 20 años, 10 meses
Puntos: 1
el script lo llamo así:

<a href="download.php?ref=646861565465">Archivo a descargar</a>

He revisado todos los espacios, parece que esta todo OK
  #11 (permalink)  
Antiguo 11/10/2006, 07:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Operadormail Ver Mensaje
el script lo llamo así:

<a href="download.php?ref=646861565465">Archivo a descargar</a>

He revisado todos los espacios, parece que esta todo OK
Para ir descartando .. haz una prueba, elimina las referencias a las sesiones (tu session_start() .. ese include de "seguridad" donde validas tus variables de sesión y el session_write_close()) ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 15:26.