使用Flysystem和ZipAdapter在Symfony4中创建ZIP文件时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Flysystem和ZipAdapter在Symfony4中创建ZIP文件时出错相关的知识,希望对你有一定的参考价值。

介绍

在我使用的个人项目中:

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

问题

当我尝试在public目录中创建ZIP存档时出现错误:Could not open zip archive at:zip:\test123my_zip_test.zip, error: 5

我的代码

创建ZIP文件的控制器

<?php

namespace AppController;

use AppUltraHelpersUltraAccess;
use AppUltraHelpersUltraWhereabouts;
use LeagueFlysystemAdapterLocal;
use LeagueFlysystemFilesystem;
use LeagueFlysystemMountManager;
use LeagueFlysystemipArchiveipArchiveAdapter;
use SymfonyComponentDependencyInjectionContainerInterface;
use SensioBundleFrameworkExtraBundleConfigurationIsGranted;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationSessionSessionInterface;
use SymfonyComponentRoutingAnnotationRoute;

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 codes。所以我的问题:error 5 = read error

最后

我错过了什么吗?

感谢您的意见和建议!

答案

我设法创建了ZIP档案,但没有使用mount manager。所以问题就在于:“不应该使用ZipAdapter /使其与mount管理器一起工作吗?”

以上是关于使用Flysystem和ZipAdapter在Symfony4中创建ZIP文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 上的 League/flysystem-aws-s3-v3 其他软件包需要较低版本

找不到类“League\Flysystem\AwsS3v3\AwsS3Adapter”(Laravel + Heroku)

Laravel 5 - 文件上传

Laravel 5 教程 - 文件上传

总的cpu使用率等于us和sy之和

SY-SUBRC 的含义