Descargar y extraer un .zip con PHP en Laravel

Uso de la clase ZipArchive y la facade HTTP para descargar y extraer un fichero .zip desde una URL.

Descargar y extraer un .zip con PHP en Laravel
Photo by Tomas Sobek / Unsplash

Estos últimos días tenía con un cliente un challenge para descargar los rates de conversión de EURO con cualquier otra currency. Sin embargo, el budget estaba bastante apurado y se esperaba necesitar muchas peticiones, por lo que acordamos sacrificar un poco de precisión y usar un único valor por día. Además, era necesario tener datos retrospectivos para actualizar los pedidos actuales.

Para ello, acudimos a la web oficial de la UE donde te permiten descargar un fichero ZIP con el histórico de precios en formato CSV. Cada fila es el precio del EURO en una fecha determinada para todas las monedas que soportan, por lo que nos venía de perlas!

Es la primera vez que tengo que descargar un fichero .zip y extraerlo usando Laravel, así que pensé en compartir este pedazo de código:

use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
use ZipArchive;

private function downloadZip()
{
	$zipUrl = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.zip';
	$zipPath = storage_path('app/currency-rates.zip');
	$zipResponse = Http::get($zipUrl)->throw();
	File::put($zipPath, $zipResponse->body());

	$zip = new ZipArchive();
	if ($zip->open($zipPath) !== true) {
    	throw new \Exception('Could not download zip file');
	}
    
    $zip->extractTo(storage_path('app'));
	$zip->close();

	File::delete($zipPath);
}

En resumen, lo que este código hace es descargar el fichero .zip y guardarlo en storage/app/currency-rates.zip. Una vez guardado, usamos la clase ZipArchive de PHP para extraer el fichero en la carpeta storage/app.

Una vez extraído, eliminamos el fichero .zip de nuestro storage y nos quedamos únicamente con los ficheros extraídos.