2017-07-24 2 views
0

La documentation illustre comment intégrer l'adaptateur flysystem de dropbox, mais ne vous montre pas comment l'intégrer à l'adaptateur ZipArchive ou similaire.Intégration de Laravel Flysystem avec Zip Archive Adapter

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

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

I essayé lecture par rapport aux procédés du FilesystemManager.php qui est la classe contenant la méthode étendre utilisé dans l'exemple de documents. J'ai trouvé une méthode appelée adapter qui semble être le ticket.

J'ai essayé d'appeler cette méthode de la façade de stockage comme ceci:

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

mais je reçois cette erreur:

BadMethodCallException Call to undefined method League\Flysystem\Filesystem::adapt

Quelqu'un at-il eu du succès l'intégration de la Laravel Filesystem avec le ZipArchiveAdapter? Je sais que je peux juste utiliser le ZipArchive natif de PHP, mais j'aimerais que tout dans le système de fichiers utilise le wrapper Laravels.

Merci!

*** Mise à jour

Mon but ultime est d'être en mesure de dézipper fermetures éclair téléchargées sur le stockage/répertoire ou s3.

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

au lieu de ceci:

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

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

Répondre

1

Pour ce que vous voulez faire, il serait préférable de créer un plugin pour League \ Flyststem. Je ne suis pas sûr s'il y a un moyen "propre" d'ajouter un plugin à Laravel-Flyststem qui est un pont entre League \ Flyststem et Laravel. L'une des solutions de contournement consiste à enregistrer un pilote personnalisé pour local/s3 qui étendra le pilote intégré avec l'injection de plug-in zip.

Il y a quelques étapes pour ACHIVE il:

1) Créer plug-in ZipExtractTo intérieur App/Système de fichiers/Plugins

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) Création de fournisseurs pour 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) Enregistrer les fournisseurs dans l'application.php

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

4) Maintenant, vous êtes en mesure de faire quelque chose comme ceci:

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

besoin d'un peu de prendre cela en, merci pour la réponse –