Как загрузить несколько изображений из базы данных в laravel 5.4

В моем приложении laravel 5.4 я хочу загрузить несколько изображений выбранного продукта из базы данных, он создает несколько zip-файлов в public_path('uploads/download-images');, но не загружает файл, как я могу его загрузить.

как лучше всего это скачать?

Что я делаю неправильно ? кто-нибудь может помочь? заранее спасибо.

Ниже мой код.

public function downloads_all(Request $request) 
 {
    $public_dir = '';
    $$zipFileName = '';
    $zip = '';
    $product_images =  DB::table('product_images')
                ->where('deleted_at', null)
                ->whereIn('product_id',  explode(',', $request->ids))
                ->get();
    if ($product_images) 
    {
        foreach ($product_images as $value) 
        {
            $zipFileName = 'product_' . $value->product_id . '_images.zip';
            $zip = new ZipArchive;
            $public_dir = public_path('uploads/download-images');
            if (!is_dir($public_dir)) 
            {
                mkdir($public_dir, 0777, true);
            }
            if ($zip->open($public_dir . '/' . $zipFileName, ZipArchive::CREATE) === TRUE) 
            {
                foreach ($product_images as $image) 
                {
                    $directory_path = base_path() . '/public/uploads/products/' . $image->product_id . '/images/';
                    $image_path = $image->image_path;
                    $file_name = basename($image_path);
                    $zip->addFile($directory_path . $file_name, $file_name);
                }
                $zip->close();
            }
        }

        $files = File::files(public_path('uploads/download-images'));
        $filecount = count($files);
        $filetopath = array();
        for ($i=0; $i < $filecount; $i++) 
        { 
            $filetopath = $public_dir . '/' . $zipFileName;
            $headers = array(
                'Content-Type' => 'application/octet-stream',
                'Expires' => 0,
                'Content-Transfer-Encoding' => 'binary',
                'Content-Length' => filesize($filetopath),
                'Cache-Control' => 'private, no-transform, no-store, must-revalidate',
                'Content-Disposition' => 'attachment; filename = "' . $zipFileName . '"',
            );

            if (file_exists($filetopath)) 
            {
                return response()->download($filetopath, $zipFileName, $headers)->deleteFileAfterSend(true);
            } 
            else 
            {
                return ['status'=>'zip file does not exist'];
            }
        }
    }
    else
    {
        return back();
    }
}

это js

$(document).ready(function () 
{
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
        }
    });

    $('#download-master').on('click', function(e) 
    {
        if ($(this).is(':checked',true))  
        {
            $(".multiple_download").prop('checked', true);  
        } else {  
            $(".multiple_download").prop('checked',false);  
        }  
    });

    $('.download-all').on('click', function(e) {

        var allVals = [];  
        $(".multiple_download:checked").each(function() {  
            allVals.push($(this).attr('data-id'));
        });  

        if (allVals.length <=0)  
        {  
            alert("Please select row to download.");  
        }  
        else 
        {  
            var join_selected_values = allVals.join(",");
            $.ajax({
                url: $(this).data('url'),
                type: 'POST',
                data:'_token = <?php echo csrf_token() ?>',
                data: 'ids='+join_selected_values,
                success: function (data) 
                {
                    alert('Seccussfully Downloaded');
                },
                error: function (data) {
                    alert(data.responseText);
                }
            }); 
        }  
    });
});
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
888
2

Ответы 2

$directory_path должен быть абсолютным путем, например, public_path('/uploads/products/') или $zip->addFile не может прочитать содержимое файла.

$ directory_path отлично подходит для любого другого решения

Shahid Hussain 09.01.2019 12:21

Это может работать в файлах лезвий шаблонов laravel, потому что веб-сервер будет знать, что именно означает /, но в этой ситуации / не является корневым веб-сервером. Вы можете проверить возвращаемое значение $res = $zip->addFile($directory_path.$file_name, $file_name);, если вы используете путь, начинающийся с /, вы получите false, если вы используете абсолютный путь, он работает нормально.

rubys 09.01.2019 12:39

Просто замените $directory_path = '/public/uploads/products/'; на $directory_path = public_path('/uploads/products/');

rubys 09.01.2019 13:24

Возможно, вам нужно проверить файл, действительно ли он существует, прежде чем добавлять его в ZipArchive, как и в предыдущем ответе.

rubys 09.01.2019 13:34

Позвольте нам продолжить обсуждение в чате.

Shahid Hussain 09.01.2019 13:35

попробуй это

if (file_exists($filetopath)) 
{
    return response()->download(storage_path($filetopath, $zipFileName, $headers));
}

@ShahidHussain Можете объяснить, почему он не работает? Какую ошибку выдает?

Chloe 09.01.2019 20:05

Другие вопросы по теме