Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

384
Vistas
¿Cómo envío datos comprimidos desde el servidor Laravel a la interfaz JS (resuelto)?

Resuelto: Agregué la solución que usé en una respuesta a continuación

Tengo un archivo json comprimido en mi carpeta de almacenamiento con la ruta storage/app/public/data.json.gz . Estoy tratando de enviar estos datos a mi frontend js a través de una solicitud de búsqueda. El envío de datos funciona, pero tengo problemas para descomprimirlos en JSON con js para usarlos en mi código js. He leído que es posible que el navegador descomprima esto automáticamente, pero no estoy seguro de cómo habilitarlo. Además, la razón por la que estoy tratando de enviar los datos comprimidos es porque son 130 MB de datos que se reducen a 7 MB cuando se comprimen y espero que enviar menos datos acelere el sitio para los usuarios.

Laravel ruta que envía archivo comprimido

 Route::get('/chunks/{index}', function ($index) { $path = 'public/chunks_'.$index.'.json.gz'; if (!Storage::exists($path)) { abort(404); } return Storage::response($path); });

Actualmente estoy usando la API de búsqueda para obtener el código JS de datos

 let chunks = await getZipFile("/chunks/0",[]).then((data) => { return data; }); public static async getZipFile(url: string, params: any = {}, method = "GET", headers: any = { "Content-Type": "application/zip", }){ headers['X-Requested-With'] = 'XMLHttpRequest'; let options: any = { 'method': method, 'headers': headers }; url += "?" + new URLSearchParams(params).toString(); const result = await fetch(url, options).then((response) => response); return result; };

cualquier ayuda sería apreciada, actualmente puedo recuperar los datos comprimidos y convertirlos en una cadena con result.text() pero no he podido descubrir cómo descomprimirlos. Intenté usar Zlib para descomprimir pero recibí un error Can't resolve './zlib_bindings' . Entonces, busque una solución similar a usar Zlib (o algo similar) para descomprimir o descubrir cómo configurar el servidor/navegador para descomprimir automáticamente.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Estás mezclando dos ideas. Las solicitudes HTTP se pueden comprimir y descomprimir a un nivel más bajo que el nivel de la aplicación. Esto significa que manejará la compresión y descompresión por sí mismo, si está habilitado. Ver aquí

Lo que tienes aquí es un archivo comprimido. Ninguna llamada frontend o ajax lo descomprimiría automáticamente.

Soluciones:

  • Habilite la compresión para solicitudes HTTP y dependa de ella para manejar la compresión automáticamente. Así que envíe el sin comprimir en esta versión. Esto podría ser útil.
  • O use una biblioteca frontend, como 'zip.js', para descomprimir cuando reciba el archivo comprimido.
about 4 years ago · Juan Pablo Isaza Denunciar

0

Terminé tomando la respuesta de Moradnejad y usé zip.js, aquí está el código actualizado

Laravel Route: en lugar de declarar una ruta para enviar el archivo, utilicé un enlace simbólico de laravel para obtener un archivo .zip de mi almacenamiento público. ( https://laravel.com/docs/9.x/filesystem#the-public-disk )

También, en caso de que sea útil, aquí está el comando que escribí para crear el archivo .zip a partir de los archivos en mi almacenamiento.

 public function handle() { $fileNames = []; for($i = 0; $i < 10000/1000; $i++){ array_push($fileNames,'public/chunks_'.$i.'.json'); } $this->zipFiles($fileNames,'./storage/app/public','./storage/app/public/chunks.zip'); return 0; } public function zipFiles($files,$path,$zipFileNameAndPath) { $zip = new ZipArchive; $zip->open($zipFileNameAndPath, ZipArchive::CREATE); foreach ($files as $file) { $zip->addFile($path.'/'.$file,$file); } $zip->close(); }

Código de solicitud JS actualizado, usé result.blob() para devolver una gota de los datos.

 public static zipRequest(url: string){ return this.getZipFile(url); } public static async getZipFile(url: string, params: any = {}, method = "GET", headers: any = { "Content-Type": "application/zip", }){ headers['X-Requested-With'] = 'XMLHttpRequest'; let options: any = { 'method': method, 'headers': headers }; if ("GET" === method) { url += "?" + new URLSearchParams(params).toString(); } else { //add csrf token to post request options.headers["X-CSRF-TOKEN"] = document.querySelector<HTMLElement>('meta[name="csrf-token"]')!.getAttribute('content'); options.body = JSON.stringify(params); } const result = await fetch(url, options).then((response) => response); return result.blob(); };

Se actualizó el resultado del blob de manejo de JS, estoy usando zip.js para obtener los 10 archivos json de los datos .zip, y luego estoy fusionando los 10 archivos json juntos.

 import * as zip from "@zip.js/zip.js"; async function getAllChunks() { let chunks = await Helper.getZipFile("storage/chunks.zip",[]).then( async (data) => { //console.log(data); let allChunks: any = []; let textReader = new zip.BlobReader(data); let zipReader = new zip.ZipReader(textReader); let entries = await zipReader.getEntries(); for(let i = 0; i < entries.length; i++){ let entry = entries[i]; if(entry.getData){ let textWriter = new zip.TextWriter(); let jsonString = await entry.getData(textWriter); let chunks = await JSON.parse(jsonString); allChunks.push.apply(allChunks, chunks); } } return allChunks; }); return chunks; }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda