Czy istnieje sposób na zip i pobieranie plików i folderów znajdujących się w wiadrze w Amazon S3, razem w Lavel? Chcę zip razem z trzema folderami i jednym plikiem na zdjęciu i pobierz go

enter image description here

3
Tauseef Mamun 24 luty 2019, 22:51

2 odpowiedzi

Najlepsza odpowiedź

Oto pół upieczonego rozwiązania w pliku trasy. Mam nadzieję, że to pomoże. https://flysystem.ThePleeague.com/docs/adapter/Zip-archive/ .

    composer require league/flysystem-ziparchive

Umieściłem to w trasach / web.php tylko na grę.

<?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');

    });

Zdecydowanie chcesz zrobić coś innego niż po prostu plopping go w publicznym reż. Może wyswalić go prosto jako pobieranie lub zapisz go gdzieś lepiej. Zapraszamy do opublikowania komentarza / pytania i możemy omówić.

2
Tarek Adam 24 luty 2019, 21:16

Zrobiłem to w następujący sposób po tym, jak patrząc na pewne rozwiązania, przesyłając strumieniowanie zamka bezpośrednio do klienta za pomocą 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');
}
1
ravin001 16 lipiec 2019, 15:04