Foros del Web » Programando para Internet » PHP »

Forzar descargas - error

Estas en el tema de Forzar descargas - error en el foro de PHP en Foros del Web. Buenas tardes, Tengo el siguiente script que lo utilizo para forzar descargas. Hace unos días, he cambiado de servidor, y ahora, en lugar de descargar ...
  #1 (permalink)  
Antiguo 06/10/2011, 09:47
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Forzar descargas - error

Buenas tardes,

Tengo el siguiente script que lo utilizo para forzar descargas. Hace unos días, he cambiado de servidor, y ahora, en lugar de descargar el archivo, lo muestra en pantalla (sea el que sea: zip, pdf, exe, etc), lo cual es un error.

Desde ya, muchas gracias.


Código PHP:
<?php
    $ruta 
"dn/";
    
$error false;
    
$extensiones = array("zip""pdf""msi""exe");
    
$mime = array("pdf" => "application/pdf""zip" => "application/zip""msi" => "application/octet-stream""exe" => "application/octet-stream");
    
$archivo $_GET["archivo"];
    
$archivotmp explode(".",$archivo);
    
$archivoExt strtolower($archivotmp[count($archivotmp)-1]);
    if (
strpos($archivo,"/") !== false) { $error 1; }
    if (!
in_array($archivoExt$extensiones)) { $error 2; }
    if (
$error === false)
    {    
        
header("Content-type: " $mime[$archivoExt]);
        
header('Content-Disposition: attachment; filename="'.$archivo.'"');
        
header("Content-Transfer-Encoding: binary");
        
$fp fopen($ruta.$archivo"r");
        
fpassthru($fp);
        
fclose($fp);
    }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;    charset=iso-8859-1">
        <title>Descargas</title>
    </head>
    <body>
        <?php
           
if($error !== false)
           {
                echo 
'<h3>Error</h3><p>Ha ocurrido un error. Puede ser debido a que no tiene autorizacion para descargar ese archivo, o que ese archivo no existe.</p>';
           }
        
?>
    </body>
</html>

Última edición por 7sistemas; 06/10/2011 a las 09:48 Razón: Error ortográfico.
  #2 (permalink)  
Antiguo 06/10/2011, 11:28
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Forzar descargas - error

Podrias intentar colocar exit; despues de fclose() para finalizar la ejecucion de PHP, de esa forma evitas la salida HTML que podria ser la causante del problema.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 06/10/2011, 11:34
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Forzar descargas - error

Hola Triby,

Según tengo entendido, basado en la experiencia, si el código se ejecuta correctamente, el código html no se mostrará (debería poner una redirección donde dices que debería ir el exit, pero no lo he hecho para hacer pruebas).

De cualquier manera, he probado lo que has dicho, y aún así, no funciona.

Gracias.
  #4 (permalink)  
Antiguo 06/10/2011, 12:07
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Forzar descargas - error

En lugar de fopen + fpasthru + fclose, podrias usar readfile() siguiendo el primer ejemplo del manual.

Claro, esto no modificara el comportamiento del navegador y, lo de la redireccion, no es posible, porque el contenido de "la pagina" debe ser exclusivamente el archivo a descargar, cualquier otra cosa que venga (antes o) despues de eso, como encabezados y/o HTML sera "basura" agregada al archivo.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 06/10/2011, 12:15
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Forzar descargas - error

También he probado lo que has dicho.

Antes de poner el post, he revisado el manual, y leído un poco más detenidamente sobre las cabeceras.

También he probado otras soluciones que he encontrado por ahí, con el mismo resultado.

De hecho, se me ocurre que tal vez tenga que ver con la configuración de apache.

Saludos y gracias.
  #6 (permalink)  
Antiguo 06/10/2011, 12:36
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Forzar descargas - error

A ver, cuando dices "lo muestra en pantalla", te refieres a codigo binario o plugins del navegador?

Si cambias el tipo y en vez de utilizar uno de los mime definidos usas esto:

header('Content-Type: application/octet-stream');

Deberia funcionar.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 06/10/2011, 15:02
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Forzar descargas - error

Cuando lo muestra en pantalla, lo muestra en binario, sea .msi, .exe, .pdf o .zip.

Originalmente, usaba application/octet-stream, pero cuando dejó de funcionar como se espera, pensé que, además de para probar, sería buena idea utilizar el tipo correspondiente.

Si quieres probarlo, verás que no hay errores tipográficos, ni se genera ningún warning o notice. De hecho, lo he probado, tal cual está, en otro servidor, y funciona como debe.

Por eso, estoy convencido de que es una configuración, o bien de apache, o de php. Pero no sé de cuál. Por cierto, tengo acceso a los .htaccess y php.ini, y si es necesario, puedo definir nuevos tipos mime (aunque éstos son estándar y están definidos.)

Muchas gracias por el tiempo.
  #8 (permalink)  
Antiguo 06/10/2011, 15:59
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Forzar descargas - error

Bueno, me parece que por ahi debes tener una salida, posiblemente antes, que es la que evita que el contenido se entregue como archivo, intenta habilitar el reporte de errores, seguramente header() emitira alguna notificacion si es el caso.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 08/10/2011, 11:09
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Forzar descargas - error

Hola,

El problema venía dado por la codificación del archivo: estaba en UTF-8 y debería estar en ANSI. Problema resuelto.

Muchas gracias.
  #10 (permalink)  
Antiguo 10/10/2011, 09:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Forzar descargas - error

Creo el problema no es si era ANSI o UTF8, si no más bien que estaba codificado usando UTF8 con BOM, lo que hacía que se enviaran las cabeceras antes del contenido del archivo y por eso se mostraba en pantalla.

PHP por defecto si detecta salida, envia cabeceras del tipo text/html. Intenta guardar tu archivo como UTF8 pero sin BOM y vas a ver que funcionará de forma correcta.

Etiquetas: headers
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:02.