6 votes

Zipper et télécharger des fichiers et des dossiers de l'Amazon S3 bucket dans Laravel

Existe-t-il un moyen de zipper et de télécharger des fichiers et des dossiers qui se trouvent dans le seau Amazon S3, ensemble dans Laravel ? Je veux zipper les trois dossiers et un fichier de l'image et les télécharger.

enter image description here

11voto

Tarek Adam Points 823

Voici une solution à moitié aboutie dans un fichier d'itinéraires. J'espère que cela vous aidera. https://flysystem.thephpleague.com/docs/adapter/zip-archive/

    composer require league/flysystem-ziparchive

Je l'ai mis dans routes/web.php juste pour jouer avec.

<?php   
    use Illuminate\Support\Facades\Storage;
    use League\Flysystem\Filesystem;
    use League\Flysystem\ZipArchive\ZipArchiveAdapter;

    Route::get('zip', function(){

        // see laravel's config/filesystem.php for the source disk
        $source_disk = 's3';
        $source_path = '';

        $file_names = Storage::disk($source_disk)->files($source_path);

        $zip = new Filesystem(new ZipArchiveAdapter(public_path('archive.zip')));

        foreach($file_names as $file_name){
            $file_content = Storage::disk($source_disk)->get($file_name);
            $zip->put($file_name, $file_content);
        }

        $zip->getAdapter()->getArchive()->close();

        return redirect('archive.zip');

    });

Vous voudrez certainement faire quelque chose d'autre que de le déposer dans la salle publique. Peut-être le diffuser directement en téléchargement ou le sauvegarder dans un meilleur endroit. N'hésitez pas à poster des commentaires/questions et nous pourrons en discuter.

7voto

ravin001 Points 551

J'ai procédé de la manière suivante après avoir examiné certaines solutions en envoyant le fichier zip directement au client à l'aide de la fonction https://github.com/maennchen/ZipStream-PHP :

if ($uploads) {

        return response()->streamDownload(function() use ($uploads) {

            $opt = new ArchiveOptions();

            $opt->setContentType('application/octet-stream');

            $zip = new ZipStream("uploads.zip", $opt);

            foreach ($uploads as $upload) {
                try {
                    $file = Storage::readStream($upload->path);
                    $zip->addFileFromStream($upload->filename, $file);
                }
                catch (Exception $e) {
                    \Log::error("unable to read the file at storage path: $upload->path and output to zip stream. Exception is " . $e->getMessage());
                }

            }

            $zip->finish();
        }, 'uploads.zip');
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X