Scaricare file zip in Laravel

Mattepuffo's logo
Scaricare file zip in Laravel

Scaricare file zip in Laravel

In questo articolo vedremo come creare un file zip e far direttamente il download in Laravel.

Solo che, in questo caso specifico, i file li prenderemo eseguendo una query su db.

Dalla tabella prenderemo i vari nomi dei files, che stanno tutti dentro la stessa cartella, e se esistono li aggiungeremo al file zip.

La query la faccio con una Stored Procedure, ma non cambia molto.

Il nome del file si trova nella colonna docl_nome (sostituitela col la vostra).

Ecco il codice:

namespace App\Http\Controllers;

use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use ZipArchive;

class DownloadDocumenti extends Controller {

  public function docLavoro($lavoroId) {
    try {
      $filePath = public_path('files');
      $zipFilePath = public_path('zip_files');
      $fileName = date('Ymd') . '_file.zip';
      $zipFile = "{$zipFilePath}/{$fileName}";

      $query = DB::select('CALL get_docs_lavoro(?)', array($lavoroId));
      $zip = new ZipArchive();

      if ($zip->open($zipFile, ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
        foreach ($query as $row) {
          $fileNome = $row->docl_nome;

          if (!empty($fileNome)) {
            if (file_exists($filePath . '/' . $fileNome)) {
              $zip->addFile($filePath . '/' . $fileNome, $row->docl_nome);
            }
          }
        }

        $zip->close();
      } else {
        return response()->json(array(
            "res" => "ko",
            "message" => "Si è verificato un errore"
        ));
      }

      return response()->download($zipFile);
    } catch (\Exception $ex) {
      return response()->json(array(
          "res" => "ko",
          "message" => $ex->getMessage()
      ));
    }

  }
  
}

La cartella zip_files è dove verranno creati i file zip; io non li cancelllo, vedete voi se volete aggiungere anche questa funzione.

Enjoy!


Condividi

Commentami!