%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/ZIPCreator.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\cfiles\libs;
use Yii;
use ZipArchive;
use yii\base\Exception;
use humhub\modules\file\models\File;
use humhub\modules\cfiles\models\File as CFile;
use humhub\modules\cfiles\models\Folder;
use humhub\modules\cfiles\models\FileSystemItem;
/**
* ZIPCreator creates ZIP Archives with given FileSystemItems
*
* @author Luke
*/
class ZIPCreator extends ZipUtil
{
/**
* @var ZipArchive the zip archive
*/
protected $archive;
/**
* @var string the filename of temp file
*/
protected $tempFile;
/**
* Creates a new ZIP
*
* @throws \yii\base\Exception
*/
public function __construct()
{
$this->cleanup();
$this->archive = new ZipArchive();
$this->tempFile = $this->getTempPath() . DIRECTORY_SEPARATOR . time();
$code = $this->archive->open($this->tempFile, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($code !== true) {
throw new Exception(Yii::t('CfilesModule.base', 'Opening archive failed with error code %code%.', ['%code%' => $code]));
}
}
/**
* Closes and writes the ZIP File
*/
public function close()
{
Yii::info('Written ZIP: ' . $this->tempFile . '(Number of files: ' . $this->archive->numFiles . ' - Status: ' . $this->archive->status . ')', 'cfiles');
$this->archive->close();
}
/**
* Returns the temporary generated ZIP File name
*
* @return string the ZIP filename
*/
public function getZipFile()
{
return $this->tempFile;
}
/**
* Adds file or folder to the ZIP
*
* @param FileSystemItem $item the item
* @param string $path path in the ZIP archive
* @throws Exception
*/
public function add(FileSystemItem $item, $path = '')
{
if ($item instanceof CFile) {
$this->addFile($item, $path);
} elseif ($item instanceof Folder) {
$this->addFolder($item, $path);
} else {
throw new Exception("Invalid file system item given to add to ZIP!");
}
}
/**
* Add a file to zip file.
*
* @param File $file the parent folder id which content should be added to the zip file
* @param string $path where we currently are in the zip file
* @param string $fileName alternative fileName otherwise use db filename
*/
public function addFile($file, $path = '', $fileName = null)
{
if ($file instanceof CFile) {
$file = $file->baseFile;
}
if (!$file) {
return;
}
if ($fileName === null) {
$filePath = $path . DIRECTORY_SEPARATOR . $file->file_name;
} else {
$filePath = $path . DIRECTORY_SEPARATOR . $fileName;
}
$filePath = $this->fixPath($filePath);
$realFilePath = $file->store->get();
if (is_file($realFilePath)) {
$this->archive->addFile($realFilePath, $filePath);
}
}
/**
* Add files and sub-directories in a folder to zip file.
*
* @param int $folderId the parent folder id which content should be added to the zip file
* @param string $path where we currently are in the zip file
*/
public function addFolder(Folder $folder, $path = '')
{
$path = $this->fixPath($path . DIRECTORY_SEPARATOR . $folder->title);
$this->archive->addEmptyDir($path);
$subFiles = CFile::find()->where(['parent_folder_id' => $folder->id])->all();
$subFolders = Folder::find()->where(['parent_folder_id' => $folder->id])->all();
foreach ($subFiles as $file) {
$this->addFile($file, $path);
}
foreach ($subFolders as $folder) {
// checkout subfolders recursively with adapted local path
$this->addFolder($folder, $path);
}
}
}