Cómo abrir archivos zip con PHP

ThemeForest tiene una buena característica; Permite a los autores cargar archivos zip que contienen capturas de pantalla de sus temas. Una secuencia de comandos luego extrae estos archivos y muestra las imágenes en consecuencia. Aunque dudo que los desarrolladores hayan usado PHP para realizar esta tarea ... eso es lo que vamos a usar!


Lo que debemos hacer

  • Cree un formulario de carga simple que permita al usuario seleccionar un archivo zip.
  • Asegúrese de que el usuario elija un archivo zip y luego guárdelo como un archivo único.
  • Extraiga el contenido del archivo zip y guárdelo en una carpeta específica.
  • Eliminar el archivo zip y hacer eco de los contenidos..

Paso 1: Creando el formulario de carga

  • Cree un nuevo archivo y guárdelo como index.html en la raíz de su solución.
  • A continuación, vamos a construir un formulario simple. Pega lo siguiente en.
 

Siempre que permita que sus usuarios carguen archivos, debe configurar el "enctype" de la etiqueta de formulario igual a "multipart / form-data". A continuación, estableceremos la acción igual a la misma página, y el método igual a la publicación.

Para mantener las cosas tan barebones como sea posible, solo tenemos una entrada de archivo y un botón de envío. Tenga en cuenta que hemos establecido el nombre de la entrada del archivo en "fupload". Pronto usaremos este valor para determinar si la página se ha publicado o no..

Paso 2: Escribiendo el PHP

En la parte superior de su página index.php, antes de que se haya declarado el doctype, pegue lo siguiente:

  

Vamos a ir paso a paso..

  • Si la etiqueta de entrada con un nombre de "fupload" está establecida, ejecute el siguiente código, de lo contrario, no haga nada..
  • Ahora necesitamos crear algunas variables. Necesitamos capturar el nombre del archivo cargado, el directorio donde se almacena temporalmente el archivo y el tipo de archivo que se eligió.

Supongamos que un usuario elige un archivo llamado "myPics.zip".

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = algún directorio temporal en el servidor.
  • $ _FILES ['fupload'] ['type'] = "application / zip". (Este valor puede cambiar según el navegador desde el que se cargó el archivo.

A continuación, vamos a explotar el nombre del archivo en dos partes: el nombre y la extensión.

 $ nombre = explotar ('.', $ nombre de archivo); $ target = 'extraído /'. $ nombre [0]. '-'. hora() . '/';

Continuando con nuestro archivo de ejemplo "myPics.zip", $ nombre [0] será igual a "myPics". $ nombre [1] será igual a "zip".

A continuación, creamos una nueva variable llamada "$ target". Esta será la ubicación donde se guardará nuestro archivo. Con el fin de garantizar que un usuario diferente con el mismo nombre de "myPics" no tenga sus archivos sobrescritos, debemos asegurarnos de que guardamos los archivos en una ubicación única. Para realizar esta tarea, implementaremos la función "time ()". Si agregamos este valor al nombre del archivo cargado, podemos estar seguros de que terminaremos con un nombre de carpeta único!

$ target = "extraído / myPics-02151985 /"

Paso 3: Asegúrate de que un archivo Zip fue seleccionado

Inmediatamente después de su variable $ target, pegue lo siguiente:

 $ accept_types = array ('application / zip', 'application / x-zip-comprimido', 'multipart / x-zip', 'aplicación / s-comprimido'); foreach ($ accept_types como $ mime_type) if ($ mime_type == $ type) $ okay = true; descanso; 
  • Comenzamos creando una matriz llamada $ accept_types. Una rápida búsqueda en Google de "tipos de zip mime" nos traerá cuatro valores: 'application / zip', 'application / x-zip-comprimido', 'multipart / x-zip', 'aplicación / s-comprimido'. Cada navegador tiene su propia forma de registrar el tipo de archivo. Debemos asegurarnos de verificar cada valor en tales casos.
  • Para hacerlo, verificamos si alguno de los elementos de nuestra matriz tiene el mismo valor que "$ _FILES ['fupload'] ['type']". Si lo hacen, estableceremos nuestra variable práctica "$ okay" igual a 'true', y podremos romper con la declaración 'for' y estar seguros de que el usuario ha elegido un archivo zip..

Desafortunadamente, Safari y Chrome no registran un tipo para archivos zip. Esto crea un problema para nosotros. Después de un poco de investigación, no pude encontrar una solución fácil, sin usar una extensión (PEAR). En su lugar, nos aseguraremos de que el nombre del archivo al menos termine en "zip". Cabe señalar que esto no es 100% seguro. ¿Qué pasa si el usuario subió un tipo de archivo diferente que terminó en 'zip'? Siéntase libre de ofrecer recomendaciones! :)

 $ okay = strtolower ($ name [1]) == 'zip'? verdadero Falso;
  • Usaremos el operador ternario para mantener esta declaración en una sola línea. Si la extensión del nombre de archivo ($ nombre [1]) es igual a 'zip', estableceremos $ okay a true. De lo contrario, será igual a 'falso'.

A continuación, verificaremos si $ está bien es falso. Si es así, sabemos que no se eligió un archivo 'zip'. En tales casos, le diremos a PHP que muera..

 if (! $ okay) die ("Por favor, elija un archivo zip, dummy!"); 

Paso 4: Guardar el archivo Zip

 mkdir ($ target); $ saved_file_location = $ target. $ nombre de archivo; if (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("Hubo un problema. ¡Lo siento!"); 
  • Primero necesitamos crear el directorio al que hacemos referencia con nuestra variable $ target. Esto se puede hacer fácilmente usando la función "mkdir".
  • A continuación, intentemos mover el archivo cargado, desde el directorio temporal, a nuestro directorio $ target. Si ese procedimiento se realizó con éxito, llamaremos a la función "openZip".

Paso 5: La función openZip ()

Crea una nueva página y guárdala como "functions.php". Ahora agregue el siguiente código:

 abierto ($ file_to_open); if ($ x === true) $ zip-> extractTo ($ target); $ zip-> close (); unlink ($ file_to_open);  else die ("Hubo un problema. ¡Inténtalo de nuevo!"); ?>

Esta función aceptará un parámetro: $ file_to_open. Este parámetro contendrá la ubicación del archivo zip que estamos intentando extraer.!

  • Para usar la clase ZipArchive (), primero debes asegurarte de habilitar 'php_zip.dll' en tu archivo "php.ini". Simplemente busca esa cadena y luego elimina el punto y coma.
  • Con cualquier clase, necesitamos crear una nueva instancia del objeto. A continuación, llamaremos al método "abierto" y pasaremos a la ubicación del archivo que se debe abrir. Si se realiza con éxito, este método devolverá 'true'. Si ese es el caso, extraeremos el contenido del archivo zip a una carpeta. Ya creamos la ruta de acceso a esta carpeta cuando creamos nuestra variable $ target. (Nota: para poder acceder a esa variable, debe agregar "global" delante de la variable. Esto le dirá a PHP que salga de la función actual y busque la variable $ target.).
  • Una vez extraídos los archivos, eliminaremos el archivo zip, ya que ya no lo necesitamos.!

Recuerde: hemos creado nuestro nuevo archivo 'functions.php', ¡pero debemos incluirlo! Agregue lo siguiente a la parte superior de su página 'index.php', justo después de abrir la etiqueta PHP.

 require_once 'functions.php';

Haciendo eco de los contenidos

¡Lo que tenemos hasta ahora funciona perfectamente! Pero, solo para darte un comentario, escaneamos el nuevo directorio y hacemos eco de los contenidos. Debes eliminar el siguiente bloque de código de tu proyecto. Es solo para pruebas. Si desea conservarlo, haga eco de la información dentro de la etiqueta del cuerpo.

 $ scan = scandir ($ target. $ name [0]); impresión '
    '; para ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); if ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; else echo '
  • '. $ scan [$ i]. '
  • '; impresión '
';

No repasaré esta última parte demasiado, ya que es innecesario. Sin embargo, si desea una explicación completa, asegúrese de ver el screencast asociado. Para resumir rápidamente, este último script escanea nuestro nuevo directorio y elimina una lista desordenada que contiene el contenido.

Terminado

No es demasiado difícil, ¿eh? Es una característica interesante que se puede implementar fácilmente en sus proyectos. ¿Qué piensas de la seguridad a la hora de subir archivos zip? ¿Cómo podemos estar seguros de que el contenido del archivo zip no es perjudicial? Me encantaría escuchar la opinión de todos sobre estas implicaciones de seguridad. Si no se maneja adecuadamente, un pirata informático podría causar un daño grave a su servidor. ¡Vamos a discutirlo! Es posible buscar tipos de archivos peligrosos (archivos .htaccess) y eliminarlos.

La página de Index.php final

 '; para ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); if ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; else echo '
  • '. $ scan [$ i]. '
  • '; impresión ''; ?> Cómo subir y abrir archivos zip con PHP

    Subir un archivo zip


    • Suscríbase a la fuente RSS de NETTUTS para obtener más artículos y artículos de desarrollo web diarios..