Saltar al contenido

Extraer un archivo de un ZIP string

este problema se puede solucionar de variadas maneras, pero en este caso te compartimos la que en nuestra opinión es la solución más completa.

Solución:

Después de algunas horas de investigación, creo que sorprendentemente no es posible manejar un zip sin un archivo temporal:

  1. El primer intento con php://memory no funcionará, porque es un flujo que no se puede leer con funciones como file_get_contents() o ZipArchive::open(). En los comentarios hay un enlace al php-bugtracker por la falta de documentación de este problema.
  2. Hay un soporte de transmisión ZipArchive con ::getStream() pero como se indica en el manual, solo admite la operación de lectura en un archivo abierto. Por lo tanto, no puede crear un archivo sobre la marcha con eso.
  3. El zip:// El contenedor también es de solo lectura: cree un archivo ZIP con el contenedor fopen ()
  4. También hice algunos intentos con los otros envoltorios / protocolos de php como

     file_get_contents("zip://data://text/plain;base64,$base64_string#test.txt")
     $zip->open("php://filter/read=convert.base64-decode/resource=$base64_string")
     $zip->open("php://filter/read=/resource=php://memory")
    

    pero para mí no funcionan en absoluto, incluso si hay ejemplos como ese en el manual. Entonces tienes que tragarte la pastilla y crear un archivo temporal.


Respuesta original:

Esta es solo la forma de almacenamiento temporal. Espero que administre el manejo de zip y el análisis de xml por su cuenta.

Usa el php php://memory (doc) envoltorio. Tenga en cuenta que esto solo es útil para archivos pequeños, porque está almacenado en la memoria, obviamente. De lo contrario, use php://temp en lugar de.

open('php://memory'));

Tuve un problema similar, terminé haciéndolo manualmente.
https://www.pkware.com/documents/casestudies/APPNOTE.TXT

Esto extrae un solo archivo (solo el primero), sin verificaciones de error / crc, se supone que se usó deflate.

// zip in a string
$data = file_get_contents('test.zip');

// magic
$head = unpack("Vsig/vver/vflag/vmeth/vmodt/vmodd/Vcrc/Vcsize/Vsize/vnamelen/vexlen", substr($data,0,30));
$filename = substr($data,30,$head['namelen']);
$raw = gzinflate(substr($data,30+$head['namelen']+$head['exlen'],$head['csize']));

// first file uncompressed and ready to use
file_put_contents($filename,$raw);

toster-cx lo hizo bien, debes otorgarle los puntos, este es un ejemplo donde el zip proviene de una respuesta de jabón como un byte array (binario), el contenido es un archivo XML:

$objResponse = $objClient->__soapCall("sendBill",array(parameters));
$fileData=unzipByteArray($objResponse->applicationResponse);
header("Content-type: text/xml");
echo $fileData;
function unzipByteArray($data)
  /*this firts is a directory*/
  $head = unpack("Vsig/vver/vflag/vmeth/vmodt/vmodd/Vcrc/Vcsize/Vsize/vnamelen/vexlen", substr($data,0,30));
  $filename = substr($data,30,$head['namelen']);
  $if=30+$head['namelen']+$head['exlen']+$head['csize'];
 /*this second is the actua file*/
  $head = unpack("Vsig/vver/vflag/vmeth/vmodt/vmodd/Vcrc/Vcsize/Vsize/vnamelen/vexlen", substr($data,$if,30));
  $raw = gzinflate(substr($data,$if+$head['namelen']+$head['exlen']+30,$head['csize']));
  /*you can create a loop and continue decompressing more files if the were*/
  return $raw;

Te mostramos reseñas y calificaciones

Agradecemos que quieras añadir valor a nuestra información colaborando tu experiencia en los informes.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *