Сжатие и загрузка файлов и папок корзины Amazon S3 в Laravel

Есть ли способ заархивировать и загрузить файлы и папки, которые находятся в корзине Amazon S3, вместе в Laravel? Хочу заархивировать три папки и один файл на картинке вместе и скачать

введите здесь описание изображения


person Tauseef Mamun    schedule 24.02.2019    source источник
comment
Вы хотите, чтобы это было один раз или как функциональность в laravel для архивирования файлов s3?   -  person Mihir Bhende    schedule 24.02.2019
comment
как функционал в laravel   -  person Tauseef Mamun    schedule 24.02.2019


Ответы (2)


Вот половинчатое решение в файле маршрута. Надеюсь, поможет. https://flysystem.thephpleague.com/docs/adapter/zip-archive/

    composer require league/flysystem-ziparchive

Я поместил это в route/web.php просто для того, чтобы поиграться.

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

    });

Вы определенно захотите сделать что-то другое, чем просто выложить его в общий каталог. Может быть, выложите его прямо в виде загрузки или сохраните где-нибудь получше. Не стесняйтесь оставлять комментарии / вопросы, и мы можем обсудить.

person Tarek Adam    schedule 24.02.2019
comment
Файлы архивируются, но не папки внутри пути... внутри трех папок есть дополнительные папки с файлами... архивируются только файлы, а не папки - person Tauseef Mamun; 25.02.2019
comment
@TauseefMamun В моем решении я использовал files() ... есть рекурсивная версия allfiles() - person Tarek Adam; 25.02.2019
comment
@TarekAdam, есть ли способ сохранить zip в S3? - person user1670816; 07.06.2019
comment
@user1670816 user1670816 измените public_path('archive.zip') на app_path('archive.zip'). Затем используйте эти 2 строки Storage::disk('s3')->writeStream('archive2.zip', Storage::readStream('archive.zip')); Storage::disk('local')->delete('archive.zip');, а затем перенаправьте куда-нибудь еще, потому что redirect('archive.zip') не будет существовать. По сути, это локальное создание почтового индекса и его отправка на s3. Извините, я не смог собрать zip на s3, возможно, если вы разместите новый вопрос, кто-то сделает лучше. К вашему сведению, вам нужно настроить s3 в project/config/filesystems.php - person Tarek Adam; 07.06.2019

Я сделал это следующим образом, просмотрев некоторые решения, передав zip-файл напрямую клиенту, используя 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');
}
person ravin001    schedule 16.07.2019