142 lines
4.9 KiB
PHP
142 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace Nextend\Framework\Browse;
|
|
|
|
use Exception;
|
|
use Nextend\Framework\Browse\BulletProof\BulletProof;
|
|
use Nextend\Framework\Controller\Admin\AdminAjaxController;
|
|
use Nextend\Framework\Filesystem\Filesystem;
|
|
use Nextend\Framework\Image\Image;
|
|
use Nextend\Framework\Notification\Notification;
|
|
use Nextend\Framework\Request\Request;
|
|
use Nextend\Framework\ResourceTranslator\ResourceTranslator;
|
|
|
|
class ControllerAjaxBrowse extends AdminAjaxController {
|
|
|
|
public function actionIndex() {
|
|
$this->validateToken();
|
|
$root = Filesystem::convertToRealDirectorySeparator(Filesystem::getImagesFolder());
|
|
$path = Filesystem::realpath($root . '/' . ltrim(rtrim(Request::$REQUEST->getVar('path', ''), '/'), '/'));
|
|
if (strpos($path, $root) !== 0) {
|
|
$path = $root;
|
|
}
|
|
$_directories = glob($path . '/*', GLOB_ONLYDIR);
|
|
$directories = array();
|
|
for ($i = 0; $i < count($_directories); $i++) {
|
|
$directories[basename($_directories[$i])] = Filesystem::toLinux($this->relative($_directories[$i], $root));
|
|
}
|
|
|
|
$extensions = array(
|
|
'jpg',
|
|
'jpeg',
|
|
'png',
|
|
'gif',
|
|
'mp4',
|
|
'mp3',
|
|
'svg',
|
|
'webp'
|
|
);
|
|
$_files = scandir($path);
|
|
$files = array();
|
|
for ($i = 0; $i < count($_files); $i++) {
|
|
$_files[$i] = $path . DIRECTORY_SEPARATOR . $_files[$i];
|
|
$ext = strtolower(pathinfo($_files[$i], PATHINFO_EXTENSION));
|
|
if (self::check_utf8($_files[$i]) && in_array($ext, $extensions)) {
|
|
$files[basename($_files[$i])] = ResourceTranslator::urlToResource(Filesystem::pathToAbsoluteURL($_files[$i]));
|
|
}
|
|
}
|
|
$relativePath = Filesystem::toLinux($this->relative($path, $root));
|
|
if (!$relativePath) {
|
|
$relativePath = '';
|
|
}
|
|
$this->response->respond(array(
|
|
'fullPath' => $path,
|
|
'path' => $relativePath,
|
|
'directories' => (object)$directories,
|
|
'files' => (object)$files
|
|
));
|
|
}
|
|
|
|
private static function check_utf8($str) {
|
|
$len = strlen($str);
|
|
for ($i = 0; $i < $len; $i++) {
|
|
$c = ord($str[$i]);
|
|
if ($c > 128) {
|
|
if (($c > 247)) return false; elseif ($c > 239) $bytes = 4;
|
|
elseif ($c > 223) $bytes = 3;
|
|
elseif ($c > 191) $bytes = 2;
|
|
else return false;
|
|
if (($i + $bytes) > $len) return false;
|
|
while ($bytes > 1) {
|
|
$i++;
|
|
$b = ord($str[$i]);
|
|
if ($b < 128 || $b > 191) return false;
|
|
$bytes--;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function actionUpload() {
|
|
if (defined('N2_IMAGE_UPLOAD_DISABLE')) {
|
|
Notification::error(n2_('You are not allowed to upload!'));
|
|
$this->response->error();
|
|
}
|
|
|
|
$this->validateToken();
|
|
|
|
$root = Filesystem::getImagesFolder();
|
|
$folder = ltrim(rtrim(Request::$REQUEST->getVar('path', ''), '/'), '/');
|
|
$path = Filesystem::realpath($root . '/' . $folder);
|
|
|
|
if ($path === false || $path == '') {
|
|
$folder = preg_replace("/[^A-Za-z0-9]/", '', $folder);
|
|
if (empty($folder)) {
|
|
Notification::error(n2_('Folder is missing!'));
|
|
$this->response->error();
|
|
} else {
|
|
Filesystem::createFolder($root . '/' . $folder);
|
|
$path = Filesystem::realpath($root . '/' . $folder);
|
|
}
|
|
}
|
|
|
|
$relativePath = Filesystem::toLinux($this->relative($path, $root));
|
|
if (!$relativePath) {
|
|
$relativePath = '';
|
|
}
|
|
$response = array(
|
|
'path' => $relativePath
|
|
);
|
|
try {
|
|
$image = Request::$FILES->getVar('image');
|
|
if ($image['name'] !== null) {
|
|
$info = pathinfo($image['name']);
|
|
$fileName = preg_replace('/[^a-zA-Z0-9_-]/', '', $info['filename']);
|
|
if (strlen($fileName) == 0) {
|
|
$fileName = '';
|
|
}
|
|
|
|
$upload = new BulletProof();
|
|
$file = $upload->uploadDir($path)
|
|
->upload($image, $fileName);
|
|
$response['name'] = basename($file);
|
|
$response['url'] = ResourceTranslator::urlToResource(Filesystem::pathToAbsoluteURL($file));
|
|
|
|
Image::onImageUploaded($file);
|
|
}
|
|
} catch (Exception $e) {
|
|
Notification::error($e->getMessage());
|
|
$this->response->error();
|
|
}
|
|
|
|
|
|
$this->response->respond($response);
|
|
}
|
|
|
|
private function relative($path, $root) {
|
|
return substr(Filesystem::convertToRealDirectorySeparator($path), strlen($root));
|
|
}
|
|
}
|