Целевая задача:
а) Загрузить ZIP-файл, распаковать его компоненты во временную директорию на моем сервере.
б) копировать / перемещать все файлы в одном месте, но переименовывать все файлы однозначно, чтобы никакие два файла не имели одинакового имени (в физическом месте)
c) разработать логическую структуру дерева папок в db (запишите имя папки при копировании и сохраните ее в db, а также сохраните ее файлы содержимого, чтобы все файлы имели родительский идентификатор той папки, к которой они принадлежат)
Explaination:
Сжатый файл загружается по адресу common / uploads / directoryies / FolderName.zip, извлекается в common / uploads / directoryies / ExtractedArchive / FolderName, а затем каждый файл проверяется в соответствии с определенными правилами файла, а затем, если проверяется, копируется в общее местоположение / загрузки / файлов /
Эти файлы находятся в одном и том же физическом месте, но в БД они подключены ниже (рекурсивно, неограниченная глубина)
Еще раз, все файлы находятся в одном каталоге на сервере, но они связаны друг с другом через структуру логического дерева каталогов.
Это становится что-то вроде ниже в БД:
fileId | filename | type | parent
1 | FolderName | folder | null
2 | File1.html | file | 1
3 | File2.txt | file | 1
4 | TestFolder | folder | 1
5 | File3.doc | file | 4
6 | file4.pdf | file | 4
7 | Another Test Folder | folder | 4
8 | docx file.docx | file | 7
9 | document file.pdf | file | 7
10 | file5.jpg | file | 4
и так далее….
файл view.php
<div class="modmgt-module-create">
<div class="panel panel-default">
<div class="panel-heading h4"><?php echo Html::encode($this->title); ?></div>
<div class="panel-body">
<div class="modmgt-module-form">
<?php $form = ActiveForm::begin(); ?>
<?php echo $form->field($model, 'uploadedFile')->fileInput(); ?>
<?php echo $form->field($model, 'description')->textarea(['class'=>'form-control', 'style'=>'max-width:100%; min-height:150px;']); ?>
<?php echo $form->field($model, 'idcategory')->dropDownList($categories, ['prompt'=>Yii::t('main', 'Please Select')]); ?>
<div class="form-group">
<?php echo Html::submitButton(Yii::t('main', 'Upload Folder'), ['class' => 'btn btn-primary']); ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>
</div>
файл controller.php
public function actionUploadDirectory($pid = null)
{
$model = new DirectoryUploadForm();
$model->parent = $pid; // The ID of parent Directory (coming from the get request)
if($model->load(Yii::$app->request->post()))
{
$UploadedZipFile = \yii\web\UploadedFile::getInstance($model, 'uploadedFile');
if(null != $UploadedZipFile)
{
// Step - 01 - Upload File on my Server (Works fine)
// Step - 02 - Extract that .zip file at my server (works fine)
//$zipExtractDir = Yii::getAlias('@common/uploads/directories/ExtractedArchive/').$UploadedZipFile->baseName;
// Step - 03 - Visit the Directory Recursively and add files in db if meet the requirements
$model->name = $UploadedZipFile->baseName;
$status = DirectoryUploadForm::addFilesfromDirectory($zipExtractDir, $model); // now this is where I get the problem
if(!$status)
{
Yii::$app->session->addFlash("error", Yii::t("main","Contents could not be added in db and Server"));
}
// Step - 04 - Delete the uploaded .zip file and its extracted directory (works fine)
return $this->redirect(['index', 'parent'=>$pid]);
}
else
{
Yii::$app->session->addFlash("error", Yii::t("main","Please upload a file"));
return $this->redirect(['index', 'parent'=>$pid]);
}
}
else
{
return $this->render('upload_directory', ['model' => $model]);
}
}
Файл filemgtFile.php
const TYPE_FOLDER = 1;
const TYPE_FILE = 2;
public function rules()
{
return [
[['name', 'uid', 'idstatus', 'type', 'idcategory', 'author', 'created'], 'required'],
[['description'], 'string'],
[['idstatus', 'type', 'parent', 'rating', 'views', 'idcategory', 'author'], 'integer'],
[['created', 'updated'], 'safe'],
[['name'], 'string', 'max' => 64],
[['extension', 'uid'], 'string', 'max' => 45],
[['idstatus'], 'exist', 'skipOnError' => true, 'targetClass' => FilemgtStatus::className(), 'targetAttribute' => ['idstatus' => 'idstatus']],
[['idcategory'], 'exist', 'skipOnError' => true, 'targetClass' => FilemgtCategory::className(), 'targetAttribute' => ['idcategory' => 'idcategory']],
[['parent'], 'exist', 'skipOnError' => true, 'targetClass' => FilemgtFile::className(), 'targetAttribute' => ['parent' => 'idfile']],
];
}
DirectoryUploadForm.php файл
public function addFilesFromDirectory($dirname, $currentModel, $depth = 0, $status = true )
{
// Step - 01 - Add a Directory of name given as $direname
$temp = explode('/', $dirname);
$name = end($temp);
// $name = $currentModel->name;
$parent = $currentModel->parent;
$description = $currentModel->description;
$idcategory = $currentModel->idcategory;
$extension = '0'; // 0 is for No Extension at all
$uid = md5($name.time());
$type = FilemgtFile::TYPE_FOLDER;
$currentModelId = // add this as directory-structure-model and get its PK // works fine
if(0 == (int)$currentModelId) // means we were unable to create a db record for it
{
Yii::$app->session->addFlash("error", Yii::t("main", "Directory with name: {$name} could not be added in db"));
return false;
}
else
{
Yii::$app->session->addFlash("success", Yii::t("main", "Directory with name: {$name} has been added successfully. . ."));
$status &= true;
}
// Step - 02 - Traverse the newly created directeory ($direname)
$dir = new \RecursiveDirectoryIterator(Yii::getAlias($dirname.DIRECTORY_SEPARATOR));
while ($dir->valid())
{
if(!$dir->isDot()) // To skip the items with . and ..
{
if($dir->isFile()) // It is a file
{
$file = $dir->current();
$name = $file->getFilename();
$parent = $currentModel->parent;
$description = $currentModel->description;
$idcategory = $currentModel->idcategory;
$extension = $file->getExtension();
$uid = md5($name.'_'.time()).'.'.$extension;
$type = FilemgtFile::TYPE_FILE;
$lastInsertId = // add this file-model in database
if(0 == (int)$lastInsertId) // case: the db Insertion failed for the file
{
Yii::$app->session->addFlash("error", Yii::t("main", "File with name: {$name} could not be added in db"));
return false;
}
else
{
// Copy Files from main location to new one
$status &= self::copyFilesFromFolder(Yii::getAlias($dirname.DIRECTORY_SEPARATOR.$name), $uid); // works fine// Create Thumbnails for Image files
$status &= self::createThumbnails(Yii::getAlias($dirname.DIRECTORY_SEPARATOR.$name), $file); // works fine
}
}
else if($dir->isDir()) // It is a directory
{
$subDir = Yii::getAlias($dir->current());
$childModel = new DirectoryUploadForm();
$childModel->parent = $currentModelId;
$childModel->description = $currentModel->description;
$childModel->idcategory = $currentModel->idcategory;
$status &= self::addFilesFromDirectory($subDir, $childModel, $depth++, $status);
if(!$status)
{
Yii::$app->session->addFlash("error", Yii::t("main", "Directory (and contents) with name: {$name} could not be added in db"));
}
}
}
$dir->next();
}
return $status;
}
проблема
Структура загрузки не поддерживается. Я получаю структуру, созданную таким образом, что родительский каталог получает файлы, которые на самом деле принадлежат его дочерней директории-модели. Тем не менее, дочерняя модель каталога также создается без какого-либо содержания. Все перепутано.
Я удалил код, который здесь не используется, чтобы вам не приходилось читать ненужный код, чтобы добраться до сути проблемы; но дайте мне знать, если вам нужно увидеть полный код, который у меня есть на моей машине.
Любая помощь приветствуется. Заранее спасибо, ребята.
Будьте благословенны.
Задача ещё не решена.
Других решений пока нет …