Utilice los paquetes Archiver y Unzipper para comprimir y descomprimir archivos en Node.js.

El archivado de archivos es una actividad cotidiana en el mundo moderno, ya que todos pueden dar fe de las ventajas que ofrece comprimir archivos o carpetas en formatos portátiles más pequeños.

El formato ZIP es uno de los formatos de archivo más populares utilizados en el mundo de la informática, y es muy recomendable opción para cualquier persona que necesite convertir archivos sin procesar en archivos comprimidos para un mejor almacenamiento, transferencia eficiente o cualquier otro razón.

Entonces, ¿por qué debería considerar comprimir sus archivos y cómo puede comprimir archivos en ZIP y extraerlos a su estado original mediante programación usando Node.js?

¿Por qué comprimir archivos?

Muchas veces, los archivos y las carpetas se vuelven muy grandes y compartirlos o transferirlos se convierte en un problema porque son o son demasiado grandes para almacenarlos en una unidad de almacenamiento de una capacidad específica o tardan demasiado en cargarse en la nube almacenamiento.

instagram viewer

En escenarios como este y muchos más, debe comprimir dichos archivos o carpetas en un tamaño mucho más pequeño. Además de una transferencia de archivos más fácil, otras razones por las que podría considerar comprimir sus archivos incluyen:

  • Almacenamiento eficiente
  • Mejor estructura y organización de archivos.
  • Seguridad (cifrado de archivos y protección con contraseña)
  • Integridad de archivos
  • Versionado de archivos

¿Qué son los paquetes Archiver y Unzipper de Node.js?

El archivador La documentación oficial del paquete describe el paquete como "una interfaz de transmisión para la generación de archivos". Esto implica que el paquete Archiver proporciona una biblioteca de funciones que aprovechan los flujos de Node.js para crear archivos comprimidos.

El paquete Archiver admite varios formatos de archivo de forma predeterminada, incluidos ZIP, GZIP y TAR. El paquete también le permite crear archivos a partir de archivos y directorios, y dividir archivos grandes en partes más pequeñas (archivos de varios volúmenes). También le permite excluir o filtrar archivos durante la compresión.

El desabrochador package es un paquete muy eficiente para extraer archivos ZIP en Node.js. El paquete proporciona una API fácil de usar que permite a los desarrolladores extraer archivos ZIP con solo unas pocas líneas de código.

Los paquetes Archiver y Unzipper son las opciones para este tutorial porque se integran a la perfección con Node.js fs módulo, lo que garantiza una compatibilidad fluida y simplicidad.

Cómo comprimir archivos a formato ZIP en Node.js

Comprimir archivos a formato ZIP en Node.js es fácil como en cualquier otro idioma, gracias al paquete Archiver. Para crear archivos ZIP en Node.js mientras sigue esta sección, necesita un entorno de desarrollo Node.js configurado en su computadora.

Creará un script simple de Node.js para comprimir un archivo y una carpeta en formato ZIP. Cree un nuevo proyecto de Nodo en su computadora ejecutando los siguientes comandos:

mkdir node-zip-archivador
cd nodo-zip-archiver
npm inicializar -y

A continuación, debe instalar el paquete Archiver en su proyecto. Correr archivador de instalación npm --save en tu terminal para instalarlo. Cuando se complete la instalación del paquete, cree un nuevo archivo en el directorio del proyecto y asígnele el nombre que prefiera, p. aplicación.js o archivador.js.

El fs El módulo maneja las operaciones de archivos, mientras que el paquete Archiver manejará la compresión de archivos y carpetas en archivos ZIP, por lo tanto, el script requiere ambos módulos.

Creación de archivos ZIP a partir de archivos

El siguiente código es la implementación de una función que acepta un archivo como argumento y crea una versión ZIP comprimida del archivo.

constante archivador = requerir('archivador')
constante f = requerir('fs')

// crear ZIP desde archivo
constante createZipFromFile = (archivo) => {
constante ruta del archivo = __dirname + '/' + archivo
constante salida = fs.createWriteStream (filePath + '.cremallera')
constante archivo = archivador('cremallera', {
zlib: { nivel: 9 } // establecer el nivel de compresión al máximo
})

archive.pipe (salida);
archive.file (filePath, { nombre: archivo })
archivo.finalizar()
}

La función toma el nombre del archivo a comprimir y genera un archivo de salida con un nombre similar (con la única distinción de agregar la extensión de archivo ZIP).

Luego, la función genera un nuevo archivo con el nivel de compresión establecido en 9 (el más alto) y utiliza el tubo función para transferir los flujos de salida del archivo a la entrada del archivo de salida.

El archivo función agrega un archivo al archivo. Acepta la ruta del archivo como un parámetro y un opcional opciones parámetro donde puede especificar las propiedades del archivo en el archivo.

El nombre La opción designa el nombre del archivo dentro del archivo. Si no se especifica la opción al agregar un archivo al archivo comprimido, Archiver coloca el archivo dentro del archivo basado en su ruta original, preservando la estructura del directorio.

Sin embargo, cuando se proporciona explícitamente, Archiver agrega el archivo al archivo sin su ruta original, lo que permite nombres y organizaciones personalizados dentro del archivo.

Creación de archivos ZIP a partir de carpetas

El proceso de creación de archivos ZIP a partir de carpetas no es muy diferente al de los archivos. La principal diferencia es el uso del paquete Archiver directorio función en contraposición a archivo en la función anterior.

A continuación se muestra la implementación de una función para comprimir una carpeta en un archivo ZIP.

// crear ZIP desde la carpeta
constante crearZipFromFolder = (carpeta) => {
constante carpetaRuta = __dirname + '/' + carpeta
constante salida = fs.createWriteStream (carpetaPath + '.cremallera')

constante archivo = archivador('cremallera', {
zlib: { nivel: 9 } // establecer el nivel de compresión al máximo
})

archive.pipe (salida)
archive.directory (carpetaPath, FALSO)
archivo.finalizar()
}

El directorio La función toma la ruta de la carpeta como primer argumento y una bandera como segundo argumento. La bandera determina la ubicación de la carpeta dentro del archivo.

Cuando la bandera se establece en FALSO, el archivo resultante solo contendrá el contenido de la carpeta, excluyendo la propia carpeta. Pero si la bandera se establece en verdadero, Archiver incluirá la propia carpeta en el archivo generado

Si desea evitar contaminar la ubicación donde está extrayendo su archivo con archivos del archivo comprimido, debe pensar en configurar el bandera opción a verdadero. Sin embargo, puede establecerlo en FALSO, si se adapta mejor a sus propósitos.

Cómo descomprimir archivos en Node.js

El proceso de extracción de archivos ZIP en Node.js tiene múltiples enfoques y varias bibliotecas están disponibles para su uso, pero en este artículo se usa el paquete Unzipper.

Ejecute el siguiente comando en su terminal para instalar el paquete Unzipper en su proyecto.

npm instalar descompresor --guardar

Después de instalar el paquete, impórtelo en su código e implemente la función de extracción ZIP que se muestra en el siguiente código:

constante desabrochar = requerir("desabrochar")

// función para extraer archivo ZIP
constante extraerZip = asíncrono (archivo) => {
constante ruta del archivo = __dirname + '/' + archivo
constante ruta de salida = __dirname + '/extraído'
esperar fs.createReadStream (ruta del archivo)
.pipe (descomprimir. Extracto({ camino: ruta de salida }))
.promesa()
}

El extractZip La función es una función asíncrona que crea un flujo de lectura para leer el contenido del archivo ZIP y extrae el archivo a la ruta de salida especificada (crea el extraído carpeta si no existe).

En el caso de descompresión o extracción, no es necesario definir diferentes funciones para archivos y carpetas, ya que un archivo ZIP es un archivo independientemente del contenido que contenga.

A continuación se muestra una función que puede agregar a la aplicación para probar las funciones que ha creado hasta ahora:

(asíncronofunción () {
constante archivo = 'prueba.pdf'
constante carpeta = 'carpeta_prueba'
constante archivo zip = 'prueba.pdf.zip'
createZipFromFile (archivo)
consola.registro('Archivo ZIP creado con éxito desde archivo')
createZipFromFolder (carpeta)
consola.registro('Archivo ZIP creado con éxito desde la carpeta')
esperar extractZip (archivo zip)
consola.registro('Archivo ZIP extraído con éxito')
}) ()

Todas las funciones anteriores son Funciones de flecha de JavaScript, pero la función anterior es diferente porque es una Expresión de función invocada inmediatamente eso encapsula el código dentro de él y lo ejecuta inmediatamente.

La compresión de archivos es beneficiosa en la creación de aplicaciones eficientes

Siempre debe ser un objetivo hacer que sus aplicaciones sean lo más eficientes posible para servir mejor a los usuarios y mantener una experiencia de usuario agradable.

En escenarios en los que necesite transferir una gran cantidad de archivos dentro de su aplicación, considere comprimir y descomprimir los archivos durante la transmisión. La mayoría de los lenguajes de programación modernos brindan soporte para comprimir y descomprimir archivos de manera eficiente.