%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/cfiles/libs/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/cfiles/libs/ZipExtractor.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences * */ /** * Created by PhpStorm. * User: buddha * Date: 27.08.2017 * Time: 20:26 */ namespace humhub\modules\cfiles\libs; use Yii; use yii\web\UploadedFile; use humhub\modules\cfiles\models\Folder; class ZipExtractor extends ZipUtil { /** * @param Folder $targetFolder * @param $file */ public function extract(Folder $targetFolder, UploadedFile $file) { $this->cleanup(); if (strtolower($file->extension) === 'zip') { $sourcePath = $this->getZipOutputPath() . '/zipped.zip'; $extractionPath = $this->getZipOutputPath() . '/extracted'; if ($file->saveAs($sourcePath, false)) { $this->unpackArchive($sourcePath, $extractionPath); $this->generateModelsFromFilesystem($targetFolder, $extractionPath); } else { $targetFolder->addError('upload', Yii::t('CfilesModule.base', 'Archive %filename% could not be extracted.', ['%filename%' => $file->name])); } } else { $targetFolder->addError('upload', Yii::t('CfilesModule.base', '%filename% has invalid extension and was skipped.', ['%filename%' => $file->name])); } return $targetFolder; } /** * Unzips an archive from sourcePath to extractionPath. * * @param string $sourcePath * @param string $extractionPath */ protected function unpackArchive($sourcePath, $extractionPath) { $zip = new \ZipArchive(); $zip->open($sourcePath); $zip->extractTo($extractionPath); $zip->close(); } /** * Generate the cfolder and cfile structure in the database of a given folder and all its subfolders recursively. * * @param Folder $targetFolder the folders parent folder. * @param string $folderPath the path of the folder. * @param Folder|null $root the $root folder which is used for adding errors if not given $targetFolder will be used as $root */ protected function generateModelsFromFilesystem(Folder $targetFolder, $folderPath, Folder $root = null) { // remove unwanted parent folder references from the scanned files $files = array_diff(scandir($folderPath), ['..','.']); if(!$root) { $root = $targetFolder; } foreach ($files as $file) { $filePath = $folderPath . DIRECTORY_SEPARATOR . $file; if (is_dir($filePath)) { $folder = $targetFolder->findFolderByName($file); if(!$folder) { $folder = $targetFolder->newFolder($file); if(!$folder->save()) { $root->addError('upload', Yii::t('CfilesModule.base', 'An error occurred while creating folder {folder}.', ['folder' => $file])); continue; } } $this->generateModelsFromFilesystem($folder, $filePath, $root); } else { $result = $this->generateModelFromFile($targetFolder, $folderPath, $file); if($result->hasErrors()) { $root->addError('upload', Yii::t('CfilesModule.base', 'An error occurred while unpacking {filename}.', ['filename' => $file])); } } } } /** * Create a cfile model and create and connect it with its basefile File model from a given data file, connect it with its parent folder. * TODO: This method has a lot in common with BrowseController/actionUpload, common logic needs to be extracted and reused * * @param Folder $targetFolder the files pid. * @param string $folderPath the path of the folder the file data lies in. * @param string $filename the files name. */ protected function generateModelFromFile(Folder $targetFolder, $folderPath, $filename) { $filePath = $folderPath . DIRECTORY_SEPARATOR . $filename; return $targetFolder->addFileFromPath($filename, $filePath); } }