Files
Admin Nasledstvo ac168868ee Initial import
2026-05-01 20:52:04 +03:00

462 lines
16 KiB
PHP

<?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;
}
}