PHP zip descargar el error

Tengo un script que permite a los usuarios descargar un archivo zip a petición. Funciona al 100% en navegadores de computadoras, pero no funciona en navegadores Android / móviles, excepto Opera (móvil).

Aquí está mi guión.

$leads = new Packer($zip_name); $index = 1; $count = 0; foreach($cLeads->lastUnitInfo['leads'] as $lead) { // build a request string $export = 'export_lead_'.$index; $req = $_POST[$export]; // add it to the zip file if(isset($req) && $req == '1') { // debug only //echo 'adding lead: '.$lead['file_name'].'<br />'; $leads->addLead('leads/'.$lead['file_name'],$lead['item_name']); $count++; //echo 'count: '.$count.'<br/>'; } $index++; } // debug //exit('count: '.$count); // displays same results on all browsers. // we got anything packed ? if($count <= 0) //// <-------- BLOCK OF BUG ON MOBILE PHONE { if(file_exists($zip_name)) unlink($zip_name); // delete the zip file created. exit('<h1>Nothing to export</h1>'); } ///// <---------------------- END BLOCK // download the leads here. $leads->purge(); exit; 

Aquí está mi función de purge()

 public function purge($zip_name = 'leads.zip') { header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="'.$zip_name.'"'); ob_clean(); flush(); readfile($this->zip_name); // errors will be disabled here unlink($this->zip_name); } 

En mi teléfono Android, el archivo zip se descarga pero contiene <h1>Nothing to export</h1> que lo convierte en un archivo zip no válido.

Así que mi problema es, ¿cómo es que el bloque sólo se ejecuta en los navegadores móviles (excepto Opera) y luego sigue descargando el zip cuando debería haber exited si $count era cero en absoluto?

Lo depuré usando Fiddler y las peticiones son todas iguales pero la salida es diferente, ¿por qué?

¿Es esto un error en PHP? Porque si miras mi código, la función purge() debería producir errores diciendo que los encabezados ya han sido enviados, pero simplemente continúa descargando el archivo zip.

Navegadores:

  • Dolphin (+ Beta)
  • FireFox
  • Navegador predeterminado de Android
  • Navegador de barcos

Versiones de PHP probadas:

  • 5.3.13 (Producción, servidor compartido)
  • 5.1.4

Esto me está volviendo loco ahora.


@Alix Este es el error más extraño que he visto. No veo seriamente ningún error lógico aquí. Para que el script inicie una descarga, en realidad tiene que haber archivos agregados a la cremallera. Ahora en mi teléfono, dice que no se agregan archivos pero hay un archivo zip en la carpeta temp . Además, si no hay archivos añadidos ( $count = 0), el script debe terminar (de ahí la función exit() ) con sólo un mensaje <h1>Nothing to export</h1> . Pero se pasa a descargar el archivo zip (que en este momento no existe, pero en la carpeta temporal que hace). El archivo zip termina siendo corrupto ya que contiene <h1>Nothing to export</h1>

Alix escribió: * > ¿Qué pasa si comenta la salida antes de servir el archivo?

Se dice que el error de archivo de readfile luego purga el archivo zip en caracteres jeroglíficos de UNICODE. Puedo decir que es el archivo zip, ya que comienza con PK y contiene los nombres de las imágenes que se exportan.

Alix escribió:

Si esto no funciona, puede que quiera cambiar exit('<h1>Nothing to export</h1>'); para salir (var_dump ($ _ REQUEST)) ;, de esta manera puede comprobar posibles errores en el envío de formularios inspeccionando el archivo Zip.

Interesante. No imprime nada excepto la cookie y un parámetro $ _GET solamente. Si puse el código en su sugerencia al principio en el script y en el bloque que agrega los archivos al zip, imprime todas las variables $_POST .

Hay claramente un error en parte de PHP aquí. Debe terminar cuando se llama a exit pero no lo hace. Y tenga en cuenta que esto sólo ocurre en los navegadores móviles excepto Opera. Voy a llorar sangre ahora.

¿Está seguro de que los otros navegadores están configurando $_POST[$export] en el valor correcto?

Además, primero debe ob_[end_]clean() y luego emitir los encabezados, no al revés:

 public function purge($zip_name = 'leads.zip') { ob_end_clean(); flush(); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="'.$zip_name.'"'); readfile($this->zip_name); // errors will be disabled here unlink($this->zip_name); } 

Además, es posible que desee configurar estos encabezados:

 header('Content-Length: ' . intval(filesize($zip_name))); header('Content-Transfer-Encoding: binary'); 

Si esto no funciona, puede que quiera cambiar exit('<h1>Nothing to export</h1>'); para exit(var_dump($_REQUEST)); , de esa manera puede comprobar posibles errores en el envío de formularios inspeccionando el archivo Zip.

  • ¿Hay alguna manera de escribir aplicaciones de Android en PHP?
  • ¿Cómo identificar imágenes similares a pesar de haber sido recortadas?
  • PhoneGap-Android: Notificación de empuje de Urban Airship desde mi servidor
  • Cargando muchas imágenes del servidor en Android
  • Cómo obtener la clasificación de la aplicación de Google PlayStore
  • ¿Cómo puedo llamar correctamente a mi PHP webservice usando ksoap2-android?
  • Pasa la variable de cadena de java a php
  • ¿Cómo conectar el cliente de android a la localhost del servidor de Apache (php) dentro de mi computadora portátil?
  • Obtenga coordenadas de Hardware GPS
  • Cómo enviar cadena de Android a php
  • Convertir PHP / MYSQL / sitio web existente en IOS Nativo / Aplicaciones de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.