gpt4 book ai didi

php - Laravel Flysystem 与 Zip Archive Adapter 集成

转载 作者:行者123 更新时间:2023-12-01 22:16:28 27 4
gpt4 key购买 nike

该文档说明了如何集成 dropbox flysystem 适配器,但未向您展示如何与 ZipArchive 适配器或类似适配器集成。

https://laravel.com/docs/5.4/filesystem#custom-filesystems

https://github.com/thephpleague/flysystem-ziparchive

我尝试阅读 FilesystemManager.php 上的方法,该类包含文档示例中使用的扩展方法。我找到了一个名为 adapt 的方法,看起来它可能就是票。

我试过像这样从 Storage facade 调用这个方法:

return $storage_with_zip = Storage::adapt(new\League\Flysystem\ZipArchive\ZipArchiveAdapter($file->getRealPath()));

但是我收到了这个错误:

BadMethodCallException
调用未定义方法 League\Flysystem\Filesystem::adapt

有没有人成功地将 Laravel 文件系统与 ZipArchiveAdapter 集成在一起?我知道我可以只使用 PHP 原生 ZipArchive,但我希望文件系统中的所有内容都使用 Laravels 包装器。

谢谢!

***更新

我的最终目标是能够将上传的 zip 解压到 storage/目录或 s3。

示例 1)$file = Storage::disk('local')->extractTo('unzipped/', $file);

而不是这个:

$zip = new ZipArchive(); 
$zip->open($file->getRealPath());
$zip->extractTo(storage_path('app') . 'unzipped');

示例 2)$file = Storage::disk('s3')->extractTo('unzipped/', $file);

最佳答案

对于你想做的事情,最好为League\Flyststem 创建一个插件。我不确定是否有一种“干净”的方法可以将插件添加到 Laravel-Flyststem,它是 League\Flyststem 和 Laravel 之间的桥梁。解决方法之一是为 local/s3 注册自定义驱动程序,这将通过注入(inject) zip 插件扩展嵌入式驱动程序。

实现它的几个步骤:

1) 在 App/Filesystem/Plugins 中创建 ZipExtractTo 插件

ZipExtractTo

namespace App\Filesystem\Plugins;

use League\Flysystem\Plugin\AbstractPlugin;
use ZipArchive;

class ZipExtractTo extends AbstractPlugin
{
/**
* @inheritdoc
*/
public function getMethod()
{
return 'extractTo';
}

/**
* Extract zip file into destination directory.
*
* @param string $path Destination directory
* @param string $zipFilePath The path to the zip file.
*
* @return bool True on success, false on failure.
*/
public function handle($path, $zipFilePath)
{
$path = $this->cleanPath($path);

$zipArchive = new ZipArchive();
if ($zipArchive->open($zipFilePath) !== true)
{
return false;
}

for ($i = 0; $i < $zipArchive->numFiles; ++$i)
{
$zipEntryName = $zipArchive->getNameIndex($i);
$destination = $path . DIRECTORY_SEPARATOR . $this->cleanPath($zipEntryName);
if ($this->isDirectory($zipEntryName))
{
$this->filesystem->createDir($destination);
continue;
}
$this->filesystem->putStream($destination, $zipArchive->getStream($zipEntryName));
}

return true;
}

private function isDirectory($zipEntryName)
{
return substr($zipEntryName, -1) === '/';
}

private function cleanPath($path)
{
return str_replace('/', DIRECTORY_SEPARATOR, $path);
}

}

2) 为 local/s3 创建提供者:

ExtendedLocalServiceProvider

namespace App\Providers;

use Storage;
use Illuminate\Support\ServiceProvider;
use App\Filesystem\Plugins\ZipExtractTo;

class ExtendedLocalServiceProvider extends ServiceProvider
{
public function boot()
{
Storage::extend('local', function($app, $config) {
return Storage::createLocalDriver($config)->addPlugin(new ZipExtractTo());
});
}
}

ExtendedS3ServiceProvider

namespace App\Providers;

use Storage;
use Illuminate\Support\ServiceProvider;
use App\Filesystem\Plugins\ZipExtractTo;

class ExtendedS3ServiceProvider extends ServiceProvider
{
public function boot()
{
Storage::extend('s3', function($app, $config) {
return Storage::createS3Driver($config)->addPlugin(new ZipExtractTo());
});
}
}

3) 在 app.php 中注册提供者

'providers' => [
...
App\Providers\ExtendedLocalServiceProvider::class,
App\Providers\ExtendedS3ServiceProvider::class,
],

4) 现在你可以做这样的事情了:

Storage::disk('local')->extractTo('unzipped/', $zipPath);
Storage::disk('s3')->extractTo('unzipped/', $zipPath);

关于php - Laravel Flysystem 与 Zip Archive Adapter 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45286056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com