0

介绍

在我的个人项目中,我正在使用:

Flysystem 的文件操作在project_dir/public文件夹和project_dir/data文件夹中都可以正常工作。

问题

当我尝试在public目录中创建 ZIP 存档时出现错误: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

最后

我错过了什么吗?

感谢您的想法和建议!

4

2 回答 2

0

我设法创建了 ZIP 档案,但没有使用mount manager. 所以问题是:“ZipAdapter 不应该/不应该与安装管理器一起使用吗?”

于 2019-03-07T15:31:30.633 回答
0

一个人在项目问题https://github.com/thephpleague/flysystem/issues/1009中遇到了类似的问题。基本上你不能将它与安装管理器一起使用。

引用https://github.com/frankdejonge

'使用装载管理器创建 zip 并没有什么意义。如果您想以一种可移植的方式从远程源创建 zip,您应该使用以下设置: 从中读取文件的源文件系统。您要在其中编写最终 ZIP 的目标文件系统。用于创建 zip 的 zip 文件系统。您使用 zip 文件系统将文件写入其中,这将始终位于本地位置。将所有文件从源文件写入 zip 后,您可以取消设置 zip 文件系统,这会导致 zip 文件的写入(PHP 的 ZipArchive 实现的限制)。您现在可以从 zip 文件位置打开读取流,并使用 writeStream 将其写入目标文件系统。

此设置将使其与源文件系统和目标文件系统无关。zip 始终是本地的,其他文件系统无法制作 zip。

于 2021-01-24T23:57:03.523 回答