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:
- El primer intento con
php://memory
no funcionará, porque es un flujo que no se puede leer con funciones comofile_get_contents()
oZipArchive::open()
. En los comentarios hay un enlace al php-bugtracker por la falta de documentación de este problema. - 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. - El
zip://
El contenedor también es de solo lectura: cree un archivo ZIP con el contenedor fopen () -
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.