2011-03-21 14 views
5

Esto es extraño.El archivo de lectura de PHP devuelve el archivo de longitud cero

Tengo un script que envía archivos zip locales al usuario a través del navegador. El script ha funcionado bien hasta ahora sin ningún problema. Hoy mi colega me ha notificado que la secuencia de comandos está enviando archivos de longitud cero.

Algunos información de fondo:

configuración
  • Server no se ha modificado antes de la secuencia de comandos que salió mal
  • diferentes navegadores probados (la misma en Chrome/Firefox)
  • archivos zip anterior (que funcionaba bien antes) son de longitud cero demasiado
  • escritura funda los archivos en el servidor
  • tamaño del archivo (cuando se hizo eco de depuración) es correcta
  • Ha intentado ajustar la configuración del servidor y la secuencia de comandos como adviced here sin éxito.

ACTUALIZACIONES:

  • is_readable() devuelve 1
  • tamaño de los archivos pueden variar entre 5 Mb y 100 Mb (no específica)
  • $zip_file sostiene la ruta del archivo
  • $zip_name contiene el nombre postal
  • El archivo es realmente de longitud cero (se abre en text-edi tor que no contiene un solo byte)
  • error_reporting es On (E_ALL) no muestra nada
  • sin cabeceras del navegador muestra la postal 'fuente' correctamente
  • Safari dice: '0 bytes de? No se puede descodificar datos en bruto 'primer síntoma útil

de fragmentos de interrogación (?):

if (file_exists($zip_file)) { 
    header('Content-type: application/zip'); 
    header('Content-disposition: filename="' . $zip_name . '"'); 
    header("Content-length: " . filesize($zip_file)); 
    readfile($zip_file); 
    exit(); 
} 

¿Cómo puedo depurar esto fácilmente?

Gracias de antemano, Fabrik

+0

pregunta estúpida: ¿existe el archivo? –

+3

es posible que desee utilizar 'is_readable()' en lugar de 'file_exists()'. Is_readable comprueba si el archivo existe y es legible. – JohnP

+0

¿Son de longitud cero o En este último caso, pueden contener un mensaje de error PHP. Simplemente busque el archivo y ábralo con un editor de texto – Unicron

Respuesta

0

Mi. Cojo. Culpa. Lo siento por todos.

Sólo Ajustado el código hace una semana y ha añadido:

if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) { 
    ob_start('ob_gzhandler'); 
} else { 
    ob_start(); 
} 

¿Qué causó esta anomalía. :(

+2

¿Qué hiciste para resolverlo? ¿Acabas de eliminar la devolución de llamada ob_gzhandler? – acme

5

http://www.php.net/manual/en/function.readfile.php#102137:

Cabe señalar que en el ejemplo:

header('Content-Length: ' . filesize($file));

archivo $ realidad debería ser la ruta completa al archivo . De lo contrario, la longitud del contenido no siempre se establecerá, lo que a menudo resulta en el temido problema del "archivo de 0 bytes".

+0

Gracias por la sugerencia, pero si me hago eco del tamaño del archivo me da el valor correcto. – fabrik

+0

no importa, cuando el navegador comienza a recibir el archivo de la única manera para saber si el tamaño completo es a través de los encabezados. – RobertPitt

+0

@Robert me refiero a un eco para la depuración – fabrik

1

El mayor problema aquí creo que es la forma en que el envío del archivo, ¿ha intentado enviar a trozos:

if (file_exists($zip_file)) 
{ 
    header('Content-type: application/zip'); 
    header('Content-disposition: filename="' . $zip_name . '"'); 
    header("Content-length: " . filesize($zip_file)); 

    $resource = fopen($zip_file,'r'); 
    while(!feof($resource)) 
    { 
     $chunk = fread($resource,4096); 
     //.... 
     echo $chunk; 
    } 

    exit(); 
} 
+0

Gracias por la sugerencia, pero no me ayudó de ninguna manera. Por cierto, cuando todo estará bien, implementaré tu solución. +1 – fabrik

0

intenta agregar attachment; y usar un navegador diferente.

header('Content-disposition: attachment; filename="' . $zip_name . '"'); 
+0

no ayuda :( – fabrik

+0

Por lo tanto, pruébalo con un archivo simple que contiene solo unos pocos caracteres ... – powtac

+0

Mira mi propia respuesta. totalmente mi culpa, lo siento. http://stackoverflow.com/questions/5375143/php-readfile-returns-zero-length-file/5375762#5375762 – fabrik

Cuestiones relacionadas