Initial import
This commit is contained in:
@@ -0,0 +1,461 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace app\controllers;
|
||||
|
||||
|
||||
use app\models\DocsCms;
|
||||
use app\models\FileCms;
|
||||
use app\services\Auth;
|
||||
use app\services\JWT;
|
||||
use app\widgets\services\Image;
|
||||
use yii\base\BaseObject;
|
||||
|
||||
class FileController extends BaseController
|
||||
{
|
||||
|
||||
public function beforeAction($action)
|
||||
{
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner()) {
|
||||
exit;
|
||||
}
|
||||
date_default_timezone_set('Europe/Sofia');
|
||||
return parent::beforeAction($action);
|
||||
}
|
||||
|
||||
public function actionGetImg($hash)
|
||||
{
|
||||
$decode = JWT::decode($hash, JWT::SECRET_KEY);
|
||||
$file = $_SERVER['DOCUMENT_ROOT'] . $decode->secure_img;
|
||||
header('Expires: 0');
|
||||
if (\Yii::$app->getRefresh()) {
|
||||
header("Cache-Control: no-cache, must-revalidate");
|
||||
} else {
|
||||
header('Cache-Control: must-revalidate, max-age=31536000');
|
||||
}
|
||||
header('Pragma: public');
|
||||
header('Content-Length: ' . filesize($file));
|
||||
header("Content-Type: image/jpeg");
|
||||
readfile($file);
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionRemoveImg()
|
||||
{
|
||||
$hash = $_POST['hash'];
|
||||
$decode = JWT::decode($hash, JWT::SECRET_KEY);
|
||||
$file = $_SERVER['DOCUMENT_ROOT'] . $decode->secure_img;
|
||||
|
||||
if (file_exists($file)) {
|
||||
unlink($file);
|
||||
return $this->asJson(['success' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
public function actionUploadFileCms()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$media_key = $_POST['media_key'];
|
||||
/** @var \app\models\_Base | null $model_class */
|
||||
$model_class = $_POST['model_class'] ?? null;
|
||||
$id = $_POST['id'] ?? null;
|
||||
$object_key = $_POST['object_key'];
|
||||
$order_index = $_POST['order_index'];
|
||||
$dir_raw = $_SERVER['DOCUMENT_ROOT'] . '/_files/raw';
|
||||
$dir_media = $_SERVER['DOCUMENT_ROOT'] . '/_files/raw/' . $media_key;
|
||||
$dir_object = $_SERVER['DOCUMENT_ROOT'] . '/_files/raw/' . $media_key . '/' . $object_key;
|
||||
$has_article = $_POST['has_article'] ?? null;
|
||||
|
||||
if (!file_exists($dir_raw))
|
||||
mkdir($dir_raw, 0777);
|
||||
if (!file_exists($dir_media))
|
||||
mkdir($dir_media, 0777);
|
||||
if (!file_exists($dir_object))
|
||||
mkdir($dir_object, 0777);
|
||||
|
||||
/* foreach ($_FILES as $id => $fileObject) {
|
||||
if (!empty($fileObject)) {
|
||||
$extension = pathinfo($fileObject['name'], PATHINFO_EXTENSION);
|
||||
$fileCms = new FileCms();
|
||||
$fileCms->media_key = $media_key;
|
||||
$fileCms->object_key = $object_key;
|
||||
$fileCms->file_name = $id . '_' . time() . '.' . $extension;
|
||||
$fileCms->file_extension = $extension;
|
||||
$fileCms->file_size = $fileObject['size'];
|
||||
$fileCms->file_type = $fileObject['type'];
|
||||
$fileCms->order_index = $order_index;
|
||||
$fileCms->date_time = date('Y-m-d H:i:s');
|
||||
if ($has_article)
|
||||
$fileCms->has_article = 1;
|
||||
if ($fileObject['type'] == 'image/jpeg' || $fileObject['type'] == 'image/jpg' || $fileObject['type'] == 'image/png') {
|
||||
$image = new Image();
|
||||
$image->crateThumb($media_key, $object_key, $fileCms->file_name, $fileCms->file_type, $fileObject['tmp_name']);
|
||||
}
|
||||
move_uploaded_file($fileObject['tmp_name'], $dir_object . '/' . $fileCms->file_name);
|
||||
$fileCms->save();
|
||||
$fileData = $fileCms->getImageData();
|
||||
return $this->asJson([
|
||||
'id' => $fileCms->id,
|
||||
'fileType' => $fileData['type'],
|
||||
'srcRaw' => $fileData['src_raw'],
|
||||
'fileName' => $fileCms->file_name,
|
||||
'mediaKey' => $media_key
|
||||
]);
|
||||
}
|
||||
} */
|
||||
|
||||
foreach ($_FILES as $id => $fileObject) {
|
||||
if (!empty($fileObject)) {
|
||||
$extension = pathinfo($fileObject['name'], PATHINFO_EXTENSION);
|
||||
$fileCms = new FileCms();
|
||||
$fileCms->media_key = $media_key;
|
||||
$fileCms->object_key = $object_key;
|
||||
$fileCms->file_name = $id . '_' . time() . '.' . $extension;
|
||||
$fileCms->file_extension = $extension;
|
||||
$fileCms->file_size = $fileObject['size'];
|
||||
$fileCms->file_type = $fileObject['type'];
|
||||
$fileCms->order_index = $order_index;
|
||||
$fileCms->date_time = date('Y-m-d H:i:s');
|
||||
if ($has_article) $fileCms->has_article = 1;
|
||||
|
||||
// Resize if image
|
||||
if (in_array($fileObject['type'], ['image/jpeg', 'image/jpg', 'image/png'])) {
|
||||
|
||||
// Load original image
|
||||
switch ($fileObject['type']) {
|
||||
case 'image/jpeg':
|
||||
case 'image/jpg':
|
||||
$srcImage = imagecreatefromjpeg($fileObject['tmp_name']);
|
||||
break;
|
||||
case 'image/png':
|
||||
$srcImage = imagecreatefrompng($fileObject['tmp_name']);
|
||||
break;
|
||||
}
|
||||
|
||||
if ($srcImage) {
|
||||
$maxWidth = 1080;
|
||||
$maxHeight = 650;
|
||||
|
||||
$width = imagesx($srcImage);
|
||||
$height = imagesy($srcImage);
|
||||
|
||||
// Calculate proportional size
|
||||
$ratio = min($maxWidth / $width, $maxHeight / $height);
|
||||
$newWidth = (int)($width * $ratio);
|
||||
$newHeight = (int)($height * $ratio);
|
||||
|
||||
// Create new resized image
|
||||
$resizedImage = imagecreatetruecolor($newWidth, $newHeight);
|
||||
|
||||
// Preserve transparency for PNG
|
||||
if ($fileObject['type'] === 'image/png') {
|
||||
imagealphablending($resizedImage, false);
|
||||
imagesavealpha($resizedImage, true);
|
||||
}
|
||||
|
||||
// Resample
|
||||
imagecopyresampled($resizedImage, $srcImage, 0, 0, 0, 0,
|
||||
$newWidth, $newHeight, $width, $height);
|
||||
|
||||
// Save resized image
|
||||
switch ($fileObject['type']) {
|
||||
case 'image/jpeg':
|
||||
case 'image/jpg':
|
||||
imagejpeg($resizedImage, $dir_object . '/' . $fileCms->file_name, 90);
|
||||
break;
|
||||
case 'image/png':
|
||||
imagepng($resizedImage, $dir_object . '/' . $fileCms->file_name);
|
||||
break;
|
||||
}
|
||||
|
||||
imagedestroy($srcImage);
|
||||
imagedestroy($resizedImage);
|
||||
}
|
||||
|
||||
// Optional: generate thumbnail
|
||||
$image = new Image();
|
||||
$image->crateThumb($media_key, $object_key, $fileCms->file_name, $fileCms->file_type, $dir_object . '/' . $fileCms->file_name);
|
||||
|
||||
} else {
|
||||
// Non-images: move file directly
|
||||
move_uploaded_file($fileObject['tmp_name'], $dir_object . '/' . $fileCms->file_name);
|
||||
}
|
||||
|
||||
$fileCms->save();
|
||||
$fileData = $fileCms->getImageData();
|
||||
return $this->asJson([
|
||||
'id' => $fileCms->id,
|
||||
'fileType' => $fileData['type'],
|
||||
'srcRaw' => $fileData['src_raw'],
|
||||
'fileName' => $fileCms->file_name,
|
||||
'mediaKey' => $media_key
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
public function actionDeleteFileCms()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$del_ids = json_decode($_POST['del_ids']);
|
||||
$files = FileCms::find()->where(['IN', 'id', $del_ids])->all();
|
||||
/** @var FileCms $file */
|
||||
foreach ($files as $file) {
|
||||
$resolutions = $file->resolutionArray;
|
||||
$resolutions[] = 'thumb';
|
||||
$fileToDelete = $_SERVER['DOCUMENT_ROOT'] . "/_files/raw/$file->media_key/$file->object_key/$file->file_name";
|
||||
if (file_exists($fileToDelete)) {
|
||||
foreach ($resolutions as $rez) {
|
||||
$readyToDelete = $_SERVER['DOCUMENT_ROOT'] . "/_files/ready/$file->media_key/$file->object_key/$rez/$file->file_name";
|
||||
if (file_exists($readyToDelete)) {
|
||||
unlink($readyToDelete);
|
||||
}
|
||||
}
|
||||
unlink($fileToDelete);
|
||||
$file->delete();
|
||||
}
|
||||
}
|
||||
if (sizeof($del_ids) > 1) {
|
||||
return $this->asJson(['success' => sizeof($del_ids) . ' файла бяха премахнати успешно']);
|
||||
} else {
|
||||
return $this->asJson(['success' => 'Файлът беше успешно премахнат']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function actionUpdateFileIndexes()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$indexes = json_decode($_POST['indexes']);
|
||||
foreach ($indexes as $index) {
|
||||
$file = FileCms::findOne($index->id);
|
||||
$file->order_index = $index->order_index;
|
||||
$file->save();
|
||||
}
|
||||
echo json_encode(['success' => true]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionUploadCrop()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$media_key = $_POST['media_key'];
|
||||
$object_key = $_POST['object_key'];
|
||||
$file_name = $_POST['file_name'];
|
||||
$resolutions = json_decode($_POST['resolutions']);
|
||||
$image = new Image();
|
||||
|
||||
foreach ($_FILES as $crop => $file) {
|
||||
$image->createCrop($crop, $file, $media_key, $object_key);
|
||||
}
|
||||
$fileCms = FileCms::find()->where([
|
||||
'media_key' => $media_key,
|
||||
'object_key' => $object_key,
|
||||
'file_name' => $file_name
|
||||
])->one();
|
||||
if ($fileCms) {
|
||||
$resolutionArray = $fileCms->resolutionArray;
|
||||
foreach ($resolutions as $resolution) {
|
||||
if (!in_array($resolution, $resolutionArray)) {
|
||||
$resolutionArray[] = $resolution;
|
||||
}
|
||||
}
|
||||
$fileCms->resolutions = json_encode($resolutionArray);
|
||||
$fileCms->save();
|
||||
$files = [];
|
||||
foreach ($resolutionArray as $r) {
|
||||
$files[$r] = "/_files/ready/$media_key/$object_key/$r/$file_name";
|
||||
}
|
||||
echo json_encode([
|
||||
'resolutions' => $resolutionArray,
|
||||
'files' => $files
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionDeleteCrop()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
$del_id = $_POST['del_id'];
|
||||
$rez = $_POST['rez'];
|
||||
$file = FileCms::findOne($del_id);
|
||||
if ($file) {
|
||||
$filePath = $_SERVER['DOCUMENT_ROOT'] . "/_files/ready/$file->media_key/$file->object_key/$rez/$file->file_name";
|
||||
if (file_exists($filePath))
|
||||
unlink($filePath);
|
||||
$file->deleteResolution($rez);
|
||||
$file->save();
|
||||
$files = [];
|
||||
foreach ($file->resolutionArray as $r) {
|
||||
$files[$r] = "/_files/ready/$file->media_key/$file->object_key/$r/$file->file_name";
|
||||
}
|
||||
echo json_encode([
|
||||
'resolutions' => $file->resolutionArray,
|
||||
'files' => $files
|
||||
]);
|
||||
}
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionClearTemporary()
|
||||
{
|
||||
if (!Auth::userAdminGlobal())
|
||||
exit;
|
||||
$temporary = FileCms::find()
|
||||
->where(['and',
|
||||
['IS', 'has_article', NULL],
|
||||
['<', 'date_time', date('Y-m-d H:i:s', (time() - (60 * 60 * 2)))]
|
||||
]);
|
||||
|
||||
$rows = $temporary->all();
|
||||
$media_keys = $temporary->select('media_key')->distinct()->all();
|
||||
$deleted = 0;
|
||||
foreach ($media_keys as $file) {
|
||||
$dirRaw = $_SERVER['DOCUMENT_ROOT'] . '/_files/raw/' . $file->media_key;
|
||||
$dirReady = $_SERVER['DOCUMENT_ROOT'] . '/_files/ready/' . $file->media_key;
|
||||
if (file_exists($dirRaw))
|
||||
system("rm -rf " . escapeshellarg($dirRaw));
|
||||
if (file_exists($dirReady))
|
||||
system("rm -rf " . escapeshellarg($dirReady));
|
||||
}
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$row->delete();
|
||||
$deleted++;
|
||||
}
|
||||
|
||||
echo $deleted . ' temporary file(s) cleaned';
|
||||
exit;
|
||||
}
|
||||
|
||||
// DOCS
|
||||
public function actionDocumentAdd()
|
||||
{
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner())
|
||||
exit;
|
||||
$p = json_decode(\Yii::$app->request->getRawBody());
|
||||
|
||||
if (!empty($p->modelId) && !empty($p->modelClass) && !empty($p->documentKey)) {
|
||||
/** @var \app\models\_Base $model */
|
||||
$model = $p->modelClass::findOne($p->modelId);
|
||||
if ($model) {
|
||||
if ($model->document_key != $p->documentKey) {
|
||||
$model->document_key = $p->documentKey;
|
||||
$model->save();
|
||||
}
|
||||
}
|
||||
$document = new DocsCms();
|
||||
$document->document_key = $p->documentKey;
|
||||
$document->save();
|
||||
|
||||
echo json_encode(['document_id' => $document->id]);
|
||||
exit;
|
||||
} else {
|
||||
echo json_encode(['error' => true, 'message' => 'Missing parameter']);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionDocumentUpdate()
|
||||
{
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner())
|
||||
exit;
|
||||
$p = json_decode(\Yii::$app->request->getRawBody());
|
||||
|
||||
if (!empty($p->id) && !empty($p->key)) {
|
||||
$document = DocsCms::findOne($p->id);
|
||||
$document->{$p->key} = $p->value ?? null;
|
||||
$document->save();
|
||||
echo json_encode(['document_id' => $document->id]);
|
||||
exit;
|
||||
} else {
|
||||
echo json_encode(['error' => true, 'message' => 'Missing parameter']);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionDocumentFileDelete() {
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner())
|
||||
exit;
|
||||
$p = json_decode(\Yii::$app->request->getRawBody());
|
||||
$model = DocsCms::findOne($p->id);
|
||||
if($model && $model->{$p->deleteField}) {
|
||||
$file = $_SERVER['DOCUMENT_ROOT']. $model->{$p->deleteField};
|
||||
if(file_exists($file)) {
|
||||
unlink($file);
|
||||
}
|
||||
$model->{$p->deleteField} = null;
|
||||
$model->save();
|
||||
echo json_encode(['success' => true, 'file' => $file]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionDocumentFileUpload()
|
||||
{
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner())
|
||||
exit;
|
||||
if (!empty($_FILES['file'])) {
|
||||
$file = $_FILES['file'];
|
||||
$id = $_POST['id'];
|
||||
$update = $_POST['update'];
|
||||
$model = DocsCms::findOne($id);
|
||||
|
||||
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);;
|
||||
|
||||
if ($model && $model->document_key) {
|
||||
$docs = $_SERVER['DOCUMENT_ROOT'] . '/_files/docs';
|
||||
$document_key = $docs . '/' . $model->document_key;
|
||||
$dirId = $document_key . '/' . $model->id;
|
||||
$dir = $dirId . '/' . $update;
|
||||
if (!file_exists($docs))
|
||||
mkdir($docs, 0777);
|
||||
if (!file_exists($document_key))
|
||||
mkdir($document_key, 0777);
|
||||
if (!file_exists($dirId))
|
||||
mkdir($dirId, 0777);
|
||||
if (!file_exists($dir))
|
||||
mkdir($dir, 0777);
|
||||
$filePath = $dir . '/' . time() . '_' . $file['name'];
|
||||
move_uploaded_file($file['tmp_name'], $filePath);
|
||||
$model->{$update} = str_replace($_SERVER['DOCUMENT_ROOT'], '', $filePath);
|
||||
if($update == 'file_name')
|
||||
{
|
||||
$model->extension = $extension;
|
||||
}
|
||||
if($update == 'file_name_en') {
|
||||
$model->extension_en = $extension;
|
||||
}
|
||||
$model->save();
|
||||
|
||||
echo json_encode(['id' => $model->id, 'file_path' => $model->{$update}, 'update' => $update, 'extension' => $extension]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function actionDocumentDelete() {
|
||||
if (!Auth::userAdminGlobal() && !Auth::userPartner())
|
||||
exit;
|
||||
$p = json_decode(\Yii::$app->request->getRawBody());
|
||||
$model = DocsCms::findOne($p->id);
|
||||
if($model) {
|
||||
$dir = $_SERVER['DOCUMENT_ROOT'] . '/_files/docs/' . $model->document_key . '/' . $model->id;
|
||||
if(file_exists($dir)) {
|
||||
system("rm -rf " . escapeshellarg($dir));
|
||||
}
|
||||
$model->delete();
|
||||
echo json_encode(['success']);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user