Ошибка при создании ZIP-файла в Symfony4 с Flysystem и ZipAdapter - PullRequest
0 голосов
/ 28 февраля 2019

Введение

В моем личном проекте я использую:

Файловые операции с Flysystem работают нормально как в папке project_dir/public, так и в папках project_dir/data.

Проблема

Когда я пытаюсь создать ZIP-архив в publicВ каталоге произошла ошибка: Could not open zip archive at:zip:\\test123\my_zip_test.zip, error: 5.

Мой код

Контроллер, который создает ZIP-файл

<?php

namespace App\Controller;

use App\UltraHelpers\UltraAccess;
use App\UltraHelpers\UltraWhereabouts;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Filesystem;
use League\Flysystem\MountManager;
use League\Flysystem\ZipArchive\ZipArchiveAdapter;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;

class AdminZipController extends BaseController
{
    /**
     * @Route("/zip", name="zip")
     */
    public function createZipArchive(Request $request, SessionInterface $session, MountManager $mountManager, ContainerInterface $container)
    {

        $kernel_project_dir = $container->getParameter('kernel.project_dir');
        $adapter_public = new Local($kernel_project_dir .'/public/uploads/');
        $adapter_zip = new ZipArchiveAdapter($kernel_project_dir .'/public/uploads/');

        $filesystem_public = new Filesystem($adapter_public);
        $filesystem_zip = new Filesystem($adapter_zip);

        $mountManager->mountFilesystem('public', $filesystem_public);
        $mountManager->mountFilesystem('zip', $filesystem_zip);

        $public_path = 'public://test123/';
        $public_zip = 'zip://test123/my_zip_test.zip';

        $adapter_zip->openArchive($public_zip);

        // get all files in directory
        $files_2_zip = $mountManager->listContents($public_path, false);

        // itereate trough all files in directory
        foreach ($files_2_zip as $object)
        {
            $mountManager->copy($object['path'], $public_zip);
        }

        $adapter_zip->getArchive()->close();

        return $this->render('default/create_zip_archive.html.twig', []);
    }
}

Обновление 1

Поскольку создание ZIP-файла продолжается в папке public, не должно возникать проблем с отсутствием доступа.

Обновление 2

Поскольку я использую Flysystem mount manager для простого управления файлами черезта же файловая система, но в разных местах. Я хотел бы использовать ту же настройку и для файлов ZIP.

Обновление 3

Обнаружено, что ZipAdapter использует PHP ZipArchive.В документации коды ошибок .Итак, моя проблема: error 5 = read error

Наконец

Я что-то упустил?

Спасибо за ваши идеи и предложения!

1 Ответ

0 голосов
/ 07 марта 2019

Мне удалось создать ZIP-архивы, но без с использованием mount manager.Таким образом, встает вопрос: «Не предполагается ли ZipAdapter работать с диспетчером монтирования?»

...