Tuve el mismo problema pero finalmente encontré una solución algo oscura y decidí compartirla aquí.
Encontré los grandes scripts zip.lib.php
/unzip.lib.php
que vienen con phpmyadmin
y se encuentran en el directorio "libraries".
Usando zip.lib.php
trabajó como un encanto para mí:
require_once(LIBS_DIR . 'zip.lib.php');
...
//create the zip
$zip = new zipfile();
//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);
...
//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");
//get the zip content and send it back to the browser
echo $zip->file();
Este script permite la descarga de una cremallera, sin la necesidad de tener los archivos como archivos reales o guardar la cremallera a sí misma como un archivo.
Es una pena que esta funcionalidad no es parte de una librería PHP más genérico.
Aquí hay un enlace al archivo zip.lib.php
de la fuente de phpMyAdmin: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php
ACTUALIZACIÓN: Asegúrese de retirar la siguiente comprobación desde el comienzo de zip.lib.php lo contrario el guión acaba termina:
if (! defined('PHPMYADMIN')) {
exit;
}
ACTUALIZACIÓN: Este código está disponible en el proyecto CodeIgniter así: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php
¿Puede este archivo contener solo un archivo o más de un archivo? – VolkerK
En mi caso específico, contiene más de uno. también pensaría que una solución de "arbitraria" grandes archivos (punto-wise) es mucho más interesante (en mi caso, puedo utilizar un archivo temporal, pero ¿qué pasa con las personas que tienen que utilizar un servidor al que se acceda a la el sistema de archivos está restringido)? – ralokt