Foros del Web » Programando para Internet » PHP »

Forzar descargas con PHP

Estas en el tema de Forzar descargas con PHP en el foro de PHP en Foros del Web. Hace tiempo que tengo un script que me está dando problemas. Lo que necesito hacer es recibir por la URL la variable Id y la ...
  #1 (permalink)  
Antiguo 19/09/2005, 12:15
 
Fecha de Ingreso: agosto-2005
Mensajes: 125
Antigüedad: 12 años, 3 meses
Puntos: 0
Forzar descargas con PHP

Hace tiempo que tengo un script que me está dando problemas.
Lo que necesito hacer es recibir por la URL la variable Id y la variable type, luego ver mi base de datos y forzar la descarga del archivo que tenga como Id el parámetro que pase por la URL, de la carpeta correspondiente según el type (el tipo de archivo que puede ser un currículum o un documento, los cuales se guardan en carpetas diferentes).
El código del archivo download.php es el siguiente:
Código PHP:
<?
//Incluyo la librería de funciones para usar la BBDD
include("includes/functions.php");

//Veo si estoy recibiendo los valores por la URL
if (isset($_GET['id']) && isset($_GET['type'])){
    
//Si es un CV, busco el nombre del archivo y compongo la ruta correspondiente
    
if($_GET['type'] == "cv"){
        
$conn conectar();
        
$ssql "SELECT * FROM equipo WHERE id = '" $_GET['id'] . "' LIMIT 1";
        
$rs preg($ssql);
        while(
$row mysql_fetch_object($rs)){
            
$archivo "cv/" $row->cv;
        }
    }else{
    
//Sino compongo la ruta para otro tipo de archivos
        
$conn conectar();
        
$ssql "SELECT * FROM materiales WHERE id = '" $_GET['id'] . "' LIMIT 1";
        
$rs preg($ssql);
        while(
$row mysql_fetch_object($rs)){
            
$archivo "docs/" $row->fichero;
        }
    }
}
//Funcion para descargar el archivo
function Descargar($ElFichero){

    
$TheFile basename($ElFichero);

    
header"Content-Type: application/octet-stream");
    
header"Content-Length: ".filesize($ElFichero));
    
header"Content-Disposition: attachment; filename=".$TheFile."");
    
readfile($ElFichero);
}


//Descargo el archivo en cuestión
Descargar($archivo);    

?>
Vale aclarar que el archivo functions.php que incluyo al principio no contiene más que declaraciones de funciones básicas para conectarme a la BBDD, hacer consultas, etc. No hay nada que pueda enviar headers.

El problema que me da cuando trato de usar el archivo es justamente que no se pueden enviar los headers porque ya fueron enviados antes.

Alguna idea de cual puede ser mi error o de otra forma de resolverlo???


Saludos y gracias.
__________________
Andrés Gattinoni
------------------------
¿Necesita un lugar en Internet? Hospedaje web en Argentina.
Planes desde $5 argentinos - Alojamiento ideal para Blogs
  #2 (permalink)  
Antiguo 19/09/2005, 12:35
Avatar de Vaalegk  
Fecha de Ingreso: abril-2005
Mensajes: 154
Antigüedad: 12 años, 8 meses
Puntos: 2
y no te dice que fichero envio los headers anteriores?
bueno intenta usar
ob_start(); al principo y ob_end_flush() al final del script debera funcionar

O si quieres saber que headers haz enviado usa
headers_sent ( [string &file [, int &line]] )
donde si la func. de devuelve true, file y line de devolveran el archivo y la linea donde se enviaron los header con anterioridad.
haz este chequeo antes de tu Descargar para ve que sucede( a lo mejor es algun warning/notice de la DB o algo asi...)
  #3 (permalink)  
Antiguo 19/09/2005, 15:12
 
Fecha de Ingreso: agosto-2005
Mensajes: 125
Antigüedad: 12 años, 3 meses
Puntos: 0
Paso los errores que me da:

Warning: Cannot modify header information - headers already sent by (output started at c:\documents and settings\El Barto\mis documentos\sitios web\catedra\includes\functions.php:55) in c:\documents and settings\El Barto\mis documentos\sitios web\catedra\download.php on line 30

Warning: Cannot modify header information - headers already sent by (output started at c:\documents and settings\El Barto\mis documentos\sitios web\catedra\includes\functions.php:55) in c:\documents and settings\El Barto\mis documentos\sitios web\catedra\download.php on line 31

Warning: Cannot modify header information - headers already sent by (output started at c:\documents and settings\El Barto\mis documentos\sitios web\catedra\includes\functions.php:55) in c:\documents and settings\El Barto\mis documentos\sitios web\catedra\download.php on line 32


Las líneas 30, 31 y 32 son las de
Código PHP:
    header"Content-Type: application/octet-stream");
    
header"Content-Length: ".filesize($ElFichero));
    
header"Content-Disposition: attachment; filename=".$TheFile.""); 
Y después de esos errores muestra el contenido del archivo. Como por lo general son archivos de Word muestra un montón de simbolos raros y después el texto del archivo.

Saludos
__________________
Andrés Gattinoni
------------------------
¿Necesita un lugar en Internet? Hospedaje web en Argentina.
Planes desde $5 argentinos - Alojamiento ideal para Blogs
  #4 (permalink)  
Antiguo 19/09/2005, 15:14
Avatar de Vaalegk  
Fecha de Ingreso: abril-2005
Mensajes: 154
Antigüedad: 12 años, 8 meses
Puntos: 2
segun esos errores mejor chequea la linea 55 de tu archivo funciones.php a ver que pasa, seun los mensajes esa es la linea que manda primero los headers...
  #5 (permalink)  
Antiguo 19/09/2005, 15:15
 
Fecha de Ingreso: agosto-2005
Mensajes: 125
Antigüedad: 12 años, 3 meses
Puntos: 0
Ah, y me olvidaba, la línea 55 del archivo functions.php es la última del código. Por las dudas se lo copio a ver si ven algo raro:

Código PHP:
<? 
include("config.inc.php");

//Conexión con BBDD

function conectar(){

    
$conn mysql_connect(BD_HOST,BD_USERNAME,BD_PASSWORD) or die("Falló la conexión con la base de datos. " mysql_error());
    
mysql_select_db(BD_NAME,$conn) or die("No se pudo seleccionar la BBDD " mysql_error());
    return 
$conn;
}

//Consulta BBDD

function preg($ssql){

    
$rs mysql_query($ssql) or die("No se pudo hacer la consulta " mysql_error());
    return 
$rs;
    
}

// Cerrar y liberar

function cerrar($rs,$conn){
    
mysql_free_result($rs); 
    
mysql_close($conn); 
}

// Solo liberar
function liberar($rs){
    
mysql_free_result($rs);
}

//Solo cerrar
function cerrarsolo($conn){
    
mysql_close($conn);
}

//////// FUNCIONES WWW.DESARROLLOWEB.COM //////////

//Convierte fecha de mysql a normal
function fecha_normal($fecha){
    
ereg"([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})"$fecha$mifecha);
    
$lafecha=$mifecha[3]."/".$mifecha[2]."/".$mifecha[1];
    return 
$lafecha;
}


//Convierte fecha de normal a mysql
function fecha_mysql($fecha){
    
ereg"([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})"$fecha$mifecha);
    
$lafecha=$mifecha[3]."-".$mifecha[2]."-".$mifecha[1];
    return 
$lafecha;

?>
En el archivo config.inc.php lo único que hago es definir las constantes con los datos de la BBDD.

Saludos
__________________
Andrés Gattinoni
------------------------
¿Necesita un lugar en Internet? Hospedaje web en Argentina.
Planes desde $5 argentinos - Alojamiento ideal para Blogs
  #6 (permalink)  
Antiguo 19/09/2005, 15:24
Avatar de Vaalegk  
Fecha de Ingreso: abril-2005
Mensajes: 154
Antigüedad: 12 años, 8 meses
Puntos: 2
mmm... hagamos una prueba.... (solo como prueba) en vez de mandar los headers solo termina el script con exit. Si en el navegador sale algo impreso eso te dara una mejor pista de quien esta realizando en output antes que los headers

otra cosa los ob_start()/ob_end_flush() no te funciona tampoco?;
  #7 (permalink)  
Antiguo 06/10/2005, 16:37
 
Fecha de Ingreso: agosto-2005
Mensajes: 125
Antigüedad: 12 años, 3 meses
Puntos: 0
Perdón por no responder en tanto tiempo, pero con ob_start() y ob_end_flush() funcionó barbaro.
Muchas gracias.

Saludos
__________________
Andrés Gattinoni
------------------------
¿Necesita un lugar en Internet? Hospedaje web en Argentina.
Planes desde $5 argentinos - Alojamiento ideal para Blogs
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 17:28.