2010-01-18 28 views
9

Estoy tratando de forzar la descarga de un archivo zip protegido (no quiero que la gente para acceder a ella sin necesidad de acceder por primera vez.Descarga del archivo .zip se ejecuta un archivo dañado php

He creado la función . para la login y tal, pero estoy corriendo en un problema donde el archivo descargado es corruptor

Aquí está el código que tengo:

$file='../downloads/'.$filename; 
header("Content-type: application/zip;\n"); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-length: ".filesize($file).";\n"); 
header("Content-disposition: attachment; filename=\"".basename($file)."\""); 
readfile("$file"); 
exit(); 

Aquí está el error: Cannot open file: It does not appear to be a valid archive.

El archivo se descarga bien, de lo contrario, debe ser algo que estoy haciendo mal con los encabezados.

¿Alguna idea?

Respuesta

18

Este problema puede deberse a varias causas. Tal vez su archivo no se encuentra o no se puede leer y, por lo tanto, el contenido del archivo es solo el mensaje de error de PHP. O el encabezado HTTP ya está enviado. O tiene algún resultado adicional que luego daña el contenido de su archivo.

Trate de añadir un poco de control de errores en la secuencia de comandos de esta manera:

$file='../downloads/'.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     readfile($file); 
     exit; 
    } 
} 
+0

Awesome Gumbo! Eso respondió. Eso fue todo ... Creo que los encabezados enviados son la razón por la que no funcionaba. – Troy

6

Apuesto dos cervezas que se produce un error PHP, y el mensaje de error ensucia el archivo ZIP. El archivo solicitado probablemente no exista.

Abra el archivo ZIP con el bloc de notas o un editor de texto similar, y descubra lo que está mal.

+6

+1 sólo dos cervezas? – danielrsmith

+0

id de acuerdo, creo que hay un error en el 'readfile()' como permisos inválidos, o se puede encontrar ... – prodigitalson

1

Aquí está la solución crear un archivo con el nombre .htaccess escritura debajo de la línea en la que SetEnv no-dont-gzip variar

cargue el archivo a su sitio web. Si usted tiene el archivo ya existe, por favor, realizar el cambio anterior en que

0

probar este para encontrar si hay cualquier error

error_reporting(0); 

No imprima nada antes de escribir los encabezados; ejecutar un ob_start() para de su script, después de que el código de edición de sus cabeceras y ob_flush() y ob_clean()

1

respuesta tardía pero tal vez útil para los usuarios no ser capaz de hacer force download trabajo.
Añadir lo siguiente en la parte superior de la secuencia de comandos php

<?php 
apache_setenv('no-gzip', 1); 
ini_set('zlib.output_compression', 0); 
Cuestiones relacionadas