Skip to Content »

Crear archivos ZIP con PHP

  • 31/10/2007
  • 10:01 am
  • unijimpe

En esta ocasión veremos la forma de crear archivos comprimidos en formato ZIP. Para este ejemplo utilizaremos la clase zipfile escrita por Eric Mueller y muy bien explicada en Creating ZIP files with PHP.

Descargando la clase zipfile

Lo primero es descargar la clase zipfile desde zipfile.inc.txt y renombrarla a zipfile.php. Esta clase tiene dos metodos add_dir() y add_file() que permite agregar una carpeta o un archivo al zip que se esta creando.

Creando nuestro primer ZIP

Lo primero es incluir el archivo recién descargado, luego de ello creamos una instancia de la clase, para este ejemplo a la instancia lo llamamos $zipfile. Luego de ello agregamos un archivo de la siguiente forma.

  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $zipfile->add_file(implode("",file("img01.jpg")), "foto.jpg");

Nótese que estamos agregando un archivo llamado img01.jpg y al momento de incluirlo en el zip lo estamos renombrando a foto.jpg. Hasta este punto hemos creado un archivo zip, el siguiente paso es enviarlo al cliente, para ello agregamos headers indicando el tipo de archivo y finalmente imprimimos el archivo:

  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $zipfile->add_file(implode("",file("img01.jpg")), "foto.jpg");
  4.  
  5. header("Content-type: application/octet-stream");
  6. header("Content-disposition: attachment; filename=zipfile.zip");
  7. echo $zipfile->file();

El resultado del ejemplo lo pueden ver en http://samples.unijimpe.net/php-zip/.

Agregando carpetas al ZIP
En el caso que agregamos varios archivos y deseamos agruparlas en una carpeta, podemos utilizar el metodo add_folder. Luego de ello agregamos los archivos a la carpeta de la siguiente forma:

  1. require ("zipfile.php");
  2. $zipfile = new zipfile();
  3. $zipfile->add_dir("img/");
  4. $zipfile->add_file(implode("",file("img01.jpg")), "img/01.jpg");
  5. $zipfile->add_file(implode("",file("img02.jpg")), "img/02.jpg");
  6. $zipfile->add_file(implode("",file("img03.jpg")), "img/03.jpg");
  7.  
  8. header("Content-type: application/octet-stream");
  9. header("Content-disposition: attachment; filename=fotos.zip");
  10. echo $zipfile->file();

Como ven agregar carpetas y multiples archivos es muy sencillo, incluso se pueden renombrar los archivos al momento de agregarlos al archivo zip. El resultado de este ejemplo lo pueden ver en: http://samples.unijimpe.net/php-zip/zipfolder.php.

Finalmente les dejo los archivos fuentes de este post, para que lo puedan utilizar y modificar de acuerdo a sus necesidades.

Posts Relacionados

Captcha con PHP y JpGraph

  • 30/10/2007
  • 10:33 am
  • unijimpe

JpGraph una de las librerías mas completas para generar imágenes de la cual hemos hablado en JpGraph: Gráficos con PHP tiene entre una de sus características la de generar imágenes para hacer captcha. En esta ocasión veremos la forma de implementar un formulario que incluya verificación por captcha para protegerlo del ataque de los spammers.

catpcha-jpgraph.gif

Captcha con JpGraph
JpGraph posee una librería llamada jpgraph_antispam.php la cual permite generar las imagenes con textos aleatorios distorsionados. Entonces lo primero es incluir el archivo jpgraph_antispam.php y luego creamos la imagen con la función Rand que recibe como parámetro la cantidad de caracteres a generar.

  1. include("inc/jpgraph_antispam.php");
  2. $spam = new AntiSpam();
  3. $code = $spam->Rand(6);
  4. $spam->Stroke();

En el ejemplo hemos generado una imagen con un texto aleatorio de 6 caracteres. Notese que el texto generado es devuelto por esta función y la hemos almacenado en la variable $code. Esta variable la podríamos almacenar en una variable de sesión para verificarla posteriormente.

Creando el Captcha
Entonces creamos un archivo php llamado captcha.php en el cual generaremos un texto aleatorio y lo almacenaremos en una variable de sesión y luego generamos la imagen captcha.

  1. // file: captcha.php
  2. include("inc/jpgraph_antispam.php");
  3. $spam = new AntiSpam();
  4. $_SESSION['tmptxt']= $spam->Rand(6);
  5. $spam->Stroke();

Con lo cual obtenemos el siguiente resultado:

Creando el formulario
el siguiente paso es la creación del formulario que deseamos proteger, para nuestro ejemplo solo incluiremos un campo de texto solicitando nombres y luego incluimos la imagen.

  1. <h3>Formulario</h3>
  2. <form name="register" method="post">
  3. Nombres<br />
  4. <input name="nombres" type="text" id="nombres" /><br />
  5. Verificacion:<br />
  6. <img src="captcha.php" width="100" height="30"><br />
  7. <input name="tmptxt" type="text" id="tmptxt" /><br />
  8. <input type="submit" name="Submit" value="Enviar" />
  9. <input name="action" type="hidden" value="checkdata">
  10. </form>

Verificando los datos
Finalmente en la pagina que recibe los datos del formulario primero verificamos que el texto ingresado corresponda al generado en el captcha antes de procesar los datos.

  1. if ($_POST['action'] == "checkdata") {
  2.     if ($_SESSION['tmptxt'] == $_POST['tmptxt']) {
  3.         echo "Bienvenido ".$_POST['nombres'];
  4.     } else {
  5.         echo "Error: Inténtalo nuevamente";
  6.     }
  7.     exit;
  8. }

Sencillo y con código muy entendible para poder modificarlo y adaptarlo a nuestras necesidades. Pueden ver el resultado del ejemplo funcionando en: http://samples.unijimpe.net/jpgraph/demo-captcha.php .

Posts Relacionados

Upload de Archivos con Flash

  • 24/10/2007
  • 10:56 am
  • unijimpe

El subir archivos a un servidor o upload es una de las tareas mas comunes, en esta ocación veremos la forma de subir archivos utilizando flash. Para ello haremos unos de la clase FileReference que permite subir o descargar archivos desde el servidor.

flashupload.gif

Creando el archivo inicial

Lo primero es crear un archivo flash con cuatro elementos básicos, el primero un campo de texto llamado txtarchivo que contendrá el nombre del archivo seleccionado para subir, el segundo es un botón llamado btbrowse que servirá para mostrar la ventana para buscar el archivo a subir, el tercero es un botón llamado btenviar que se encargará de hacer iniciar el envío y finalmente un campo de texto llamado txtestado que mostrará el estado del proceso.

Además de ello es necesario importar la clase que contiene a FileReference de la siguiente forma:

  1. import flash.net.FileReference;

Filtrando tipos de Archivo

Lo siguiente es definir que tipos de archivos se podrán aceptar, para ello creamos una variable llamada arrTypes donde agregaremos un objeto que contiene dos propiedades: description (Texto a mostrarse al seleccionar el archivo) y extension (Contiene todas las extensiones aceptadas).

  1. var arrTypes:Array = new Array();
  2. var objTypes:Object = new Object();
  3. objTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)";
  4. objTypes.extension = "*.jpg; *.jpeg; *.gif; *.png";
  5. arrTypes.push(objTypes);

Subiendo Archivos

El siguiente paso es crear una variable del tipo FileReference con el cual podremos subir los archivos seleccionados. Una vez creada la variable listUpload le adjuntamos un listener que nos servirá para detectar los eventos del upload. Por ejemplo al seleccionar el archivo (onSelect) mostramos el nombre del archivo seleccionado en el campo txtarchivo.

  1. var listUpload:Object = new Object();
  2. var fileUpload:FileReference = new FileReference();
  3. fileUpload.addListener(listUpload);
  4. listUpload.onSelect = function(file) {
  5.     txtarchivo.text = file.name;
  6. }
  7. listUpload.onProgress = function(file, bytesLoaded, bytesTotal):Void {
  8.     txtestado.text = "Subiendo archivo " + Math.round(bytesLoaded*100/bytesTotal) + "%";
  9. }
  10. listUpload.onComplete = function(file:FileReference):Void {
  11.     txtestado.text = "Archivo subido correctamente";
  12. }

Luego de ello es necesario agregarle las opciones a nuestros botones, agregamos el evento para seleccionar y para enviar.

  1. btbrowse.onRelease = function() {
  2.     fileUpload.browse(arrTypes);
  3. }
  4. btenviar.onRelease = function() {
  5.     fileUpload.upload("upload.php?action=upload");
  6. }

Uniendo todos estos elementos, tenemos el código necesario para hacer upload de archivos en flash.

  1. import flash.net.FileReference;
  2.  
  3. var arrTypes:Array = new Array();
  4. var objTypes:Object = new Object();
  5. objTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)";
  6. objTypes.extension = "*.jpg; *.jpeg; *.gif; *.png";
  7.  
  8. arrTypes.push(objTypes);
  9.  
  10. var listUpload:Object = new Object();
  11. var fileUpload:FileReference = new FileReference();
  12. fileUpload.addListener(listUpload);
  13.  
  14. listUpload.onSelect = function(file) {
  15.     txtarchivo.text = file.name;
  16. }
  17. listUpload.onProgress = function(file, bytesLoaded, bytesTotal):Void {
  18.     txtestado.text = "Subiendo archivo " + Math.round(bytesLoaded*100/bytesTotal) + "%";
  19. }
  20. listUpload.onComplete = function(file:FileReference):Void {
  21.     txtestado.text = "Archivo subido correctamente";
  22. }
  23.  
  24. btbrowse.onRelease = function() {
  25.     fileUpload.browse(arrTypes);
  26. }
  27. btenviar.onRelease = function() {
  28.     fileUpload.upload("upload.php?action=upload");
  29. }

Guardando los archivos en el Servidor

Hasta este punto se ha hecho el envío al servidor, pero nos hace falta un script en el servidor que se encargue de recibir y guardar este archivo. En nuestro caso utilizaremos PHP, para ello nos basaremos en el ejemplo Upload de Archivos con PHP.

  1. if ($_GET["action"] == "upload") {
  2.     $archivo = $_FILES["Filedata"]['name'];
  3.     $prefijo = substr(md5(uniqid(rand())),0,6);
  4.    
  5.     if ($archivo != "") {
  6.         $destino"files/".$prefijo."_".$archivo;
  7.         copy($_FILES['Filedata']['tmp_name'], $destino);
  8.     }
  9. }

Pueden ver el resultado del ejemplo en flashupload. Finalmente les dejo los archivos fuente del ejemplo, para que lo puedan probar y hacer sus adaptaciones.

Posts Relacionados