459 lines
12 KiB
PHP
459 lines
12 KiB
PHP
<?php
|
|
require_once('config.php');
|
|
|
|
function fail($msg) {
|
|
$uploadResult[0] = false;
|
|
$uploadResult[1] = $msg;
|
|
sendResponse($uploadResult);
|
|
die;
|
|
}
|
|
|
|
function sendResponse($uploadResult, $baseUrl) {
|
|
global $config;
|
|
if ($config['AllowExternalWebsites'] != '')
|
|
header('Access-Control-Allow-Origin: '.$config['AllowExternalWebsites']);
|
|
|
|
if ($_GET['client'] == 'plupload') {
|
|
if ($uploadResult[0] === true) {
|
|
echo $baseUrl.$uploadResult[1][0];
|
|
} else {
|
|
echo "!" . $uploadResult[1];
|
|
}
|
|
} else if ($_GET['client'] == 'tinymce') {
|
|
$result = '';
|
|
if ($uploadResult[0] === true) {
|
|
foreach ($uploadResult[1] as $f) {
|
|
if (strlen($result) > 0)
|
|
$result .= '|';
|
|
$result .= $baseUrl.$f;
|
|
}
|
|
} else
|
|
$result = '!' . $uploadResult[1];
|
|
|
|
echo $result;
|
|
} else {
|
|
$CKEditorFuncNum = $_GET['CKEditorFuncNum'];
|
|
if ($uploadResult[0] === true)
|
|
echo "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction(".$CKEditorFuncNum.", '".$baseUrl.$uploadResult[1][0]."', '');</script>";
|
|
else
|
|
echo "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction(".$CKEditorFuncNum.", '', '".$uploadResult[1]. "');</script>";
|
|
|
|
}
|
|
}
|
|
|
|
function getThumbFileName($fileName) {
|
|
$a = explode('.', $fileName);
|
|
$a[count($a) - 2] .= '_small';
|
|
$fileNameThumb = implode('.', $a);
|
|
return $fileNameThumb;
|
|
}
|
|
|
|
function uploadFile(
|
|
$name,
|
|
$tmp_name,
|
|
$error,
|
|
$size,
|
|
$toDir,
|
|
$allowedExtensions,
|
|
$maxSize,
|
|
$imgEnlarge,
|
|
$imgWidth,
|
|
$imgHeight,
|
|
$doThumb,
|
|
$thumbEnlarge,
|
|
$thumbWidth,
|
|
$thumbHeight
|
|
) {
|
|
|
|
if ($error != 0) {
|
|
$message = "There was an upload error for file `'.$name.'`, code #".$error.". Check your server's configuration";
|
|
switch ($error) {
|
|
case UPLOAD_ERR_INI_SIZE: $message = "The uploaded file `'.$name.'` exceeds the upload_max_filesize directive in php.ini"; break;
|
|
case UPLOAD_ERR_FORM_SIZE: $message = "The uploaded file `'.$name.'` exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"; break;
|
|
case UPLOAD_ERR_PARTIAL: $message = "The uploaded file `'.$name.'` was only partially uploaded"; break;
|
|
case UPLOAD_ERR_NO_FILE: $message = "No file was uploaded"; break;
|
|
case UPLOAD_ERR_NO_TMP_DIR: $message = "Missing a temporary folder on your server"; break;
|
|
case UPLOAD_ERR_CANT_WRITE: $message = "Failed to write file to disk on your server"; break;
|
|
case UPLOAD_ERR_EXTENSION: $message = "File upload stopped by extension"; break;
|
|
}
|
|
return array(false, $message);
|
|
}
|
|
|
|
if ($size == 0)
|
|
return array(false, 'File `'.$name.'` size = 0');
|
|
|
|
if ($maxSize > 0 && $size > $maxSize)
|
|
return array(false, 'Size of file `'.$name.'` exceeds the limit of '.$maxSize.' bytes');
|
|
|
|
$a = explode('.', $name);
|
|
$type = $a[count($a)-1];
|
|
error_log($type);
|
|
if ($allowedExtensions[0] != '*' && !in_array(strtolower($type), array_map('strtolower', $allowedExtensions)))
|
|
return array(false, 'Wrong extension for file `'.$name.'`. Allowed extensions are: ' . implode(', ', $allowedExtensions));
|
|
|
|
$fileName;
|
|
$fileNameThumb;
|
|
|
|
// Search for file name
|
|
$ok = false;
|
|
$i = -1;
|
|
do {
|
|
$i ++;
|
|
if ($i == 0)
|
|
$fileName = $name;
|
|
else
|
|
$fileName = $i . '_' . $name;
|
|
$ok = !is_file($toDir . $fileName);
|
|
if ($doThumb) {
|
|
$fileNameThumb = getThumbFileName($fileName);
|
|
$ok = $ok && !file_exists($toDir . $fileNameThumb);
|
|
}
|
|
} while (!$ok);
|
|
|
|
$filePath = $toDir . $fileName;
|
|
if (is_uploaded_file($tmp_name))
|
|
$moveResult = move_uploaded_file($tmp_name, $filePath);
|
|
else
|
|
$moveResult = rename($tmp_name, $filePath);
|
|
if ($moveResult === false)
|
|
return array(false, 'Error while moving uploaded file to destination folder: check folder permissions on server side');
|
|
|
|
if ($imgWidth > 0 || $imgHeight > 0) {
|
|
$err = resizeImg(
|
|
$filePath,
|
|
$imgEnlarge,
|
|
$imgWidth,
|
|
$imgHeight,
|
|
true
|
|
);
|
|
if ($err != null)
|
|
return array(false, 'Error while resizing image `'.$name.'`: '.$err);
|
|
}
|
|
|
|
if ($doThumb) {
|
|
$err = resizeImg(
|
|
$filePath,
|
|
$thumbEnlarge,
|
|
$thumbWidth,
|
|
$thumbHeight,
|
|
false
|
|
);
|
|
if ($err != null)
|
|
return array(false, 'Error while making thumbnail of image `'.$name.'`: '.$err);
|
|
}
|
|
|
|
return array(true, $fileName);
|
|
}
|
|
|
|
|
|
// return array(ok?, tmp_file_name / error_text)
|
|
function rehost($url, $maxSize) {
|
|
if ($maxSize > 0)
|
|
$bytes = file_get_contents($url, false, null, -1, $maxSize);
|
|
else
|
|
$bytes = file_get_contents($url);
|
|
|
|
if ($bytes == false)
|
|
return array(false, "Unable to locate file on external server".($maxSize > 0 ? " or file size limit exceeded" : ""));
|
|
|
|
// $http_response_header filled by file_get_contents()
|
|
foreach($http_response_header as $header)
|
|
{
|
|
if (strpos(strtolower($header),'content-disposition') !== false)
|
|
{
|
|
$tmp_name = explode('=', $header);
|
|
if ($tmp_name[1])
|
|
$file = trim($tmp_name[1],'";\'');
|
|
}
|
|
}
|
|
if (!isset($file)) {
|
|
$stripped_url = preg_replace('/\\?.*/', '', $url);
|
|
$file = basename($stripped_url);
|
|
}
|
|
|
|
$tmpDir = sys_get_temp_dir();
|
|
if (file_exists($tmpDir.'/'.$file)) {
|
|
$n = 1;
|
|
do {
|
|
$n ++;
|
|
} while (file_exists($tmpDir.'/'.$n.'_'.$file));
|
|
$file = $n.'_'.$file;
|
|
}
|
|
$tmpFile = $tmpDir.'/'.$file;
|
|
|
|
$bytesDownloaded = file_put_contents($tmpFile, $bytes);
|
|
if ($bytesDownloaded === false)
|
|
return array(false, "Unable to write downloaded data to: " . $tmpFile);
|
|
return array(true, $tmpFile);
|
|
}
|
|
|
|
// If any error returns array(false, string)
|
|
// If all ok, returns array(true, array(file1, file2, ...))
|
|
function upload($doThumb, $imgEnlarge, $imgWidth, $imgHeight, $thumbEnlarge, $thumbWidth, $thumbHeight) {
|
|
global $config;
|
|
if (!empty($_GET) && isset($_GET['type']) && array_key_exists($_GET['type'],$config['ResourceType']))
|
|
$rType = $config['ResourceType'][$_GET['type']];
|
|
else
|
|
return array(false, 'Resource type (type) is defined incorrectly ('.$_GET['type'].')');
|
|
|
|
if (!isset($_GET['rehost'])) {
|
|
|
|
if (isset($_FILES['file'])) // for Plupload
|
|
$_FILES['upload'] = $_FILES['file'];
|
|
else if (isset($_FILES['files'])) // for JQuery File Upload
|
|
$_FILES['upload'] = $_FILES['files'];
|
|
|
|
if (!isset($_FILES['upload']))
|
|
return array(false, 'No files to process');
|
|
|
|
$data = $_FILES['upload'];
|
|
$files = array();
|
|
if (is_array($data['name'])) {
|
|
for ($i = 0; $i < count($data['name']); $i++)
|
|
$files[] = array(
|
|
'name' => $data['name'][$i],
|
|
'tmp_name' => $data['tmp_name'][$i],
|
|
'error' => $data['error'][$i],
|
|
'size' => $data['size'][$i]
|
|
);
|
|
} else {
|
|
$files[] = $data;
|
|
}
|
|
} else {
|
|
if (isset($_GET['url'])) {
|
|
$result = rehost($_GET['url'], $rType['maxSize']);
|
|
if ($result[0] === true) {
|
|
$name = basename($result[1]);
|
|
$file = array(
|
|
'name' => $name,
|
|
'tmp_name' => $result[1],
|
|
'size' => filesize($result[1]),
|
|
'error' => ''
|
|
);
|
|
$files = array();
|
|
$files[] = $file;
|
|
} else {
|
|
return $result;
|
|
}
|
|
} else
|
|
return array(false, 'No URL to process');
|
|
}
|
|
|
|
$resultFiles = array();
|
|
foreach ($files as $file) {
|
|
$fileResult = uploadFile(
|
|
$file['name'],
|
|
$file['tmp_name'],
|
|
$file['error'],
|
|
$file['size'],
|
|
$config['BaseDir'],
|
|
explode(',',$rType['allowedExtensions']),
|
|
$rType['maxSize'],
|
|
$imgEnlarge,
|
|
$imgWidth,
|
|
$imgHeight,
|
|
$doThumb,
|
|
$thumbEnlarge,
|
|
$thumbWidth,
|
|
$thumbHeight
|
|
);
|
|
if ($fileResult[0] !== true)
|
|
return $fileResult; // error
|
|
else
|
|
$resultFiles[] = $fileResult[1];
|
|
}
|
|
|
|
return array(true, $resultFiles);
|
|
}
|
|
|
|
|
|
function resizeImg($sourceFile, $resizeOnLess, $maxWidth, $maxHeight, $resizeself) {
|
|
global $config;
|
|
if ($maxWidth <= 0 && $maxHeight <= 0 && $resizeself)
|
|
return null;
|
|
|
|
$sourceImageAttr = @getimagesize($sourceFile);
|
|
if ($sourceImageAttr === false)
|
|
return "unable to get image size";
|
|
|
|
switch ($sourceImageAttr['mime']) {
|
|
case 'image/gif': {
|
|
if (@imagetypes() & IMG_GIF)
|
|
$oImage = @imagecreatefromgif($sourceFile);
|
|
else
|
|
$ermsg = 'GIF images are not supported';
|
|
}
|
|
break;
|
|
case 'image/jpeg': {
|
|
if (@imagetypes() & IMG_JPG)
|
|
$oImage = @imagecreatefromjpeg($sourceFile) ;
|
|
else
|
|
$ermsg = 'JPEG images are not supported';
|
|
}
|
|
break;
|
|
case 'image/png': {
|
|
if (@imagetypes() & IMG_PNG)
|
|
$oImage = @imagecreatefrompng($sourceFile) ;
|
|
else
|
|
$ermsg = 'PNG images are not supported';
|
|
}
|
|
break;
|
|
case 'image/wbmp': {
|
|
if (@imagetypes() & IMG_WBMP)
|
|
$oImage = @imagecreatefromwbmp($sourceFile);
|
|
else
|
|
$ermsg = 'WBMP images are not supported';
|
|
}
|
|
break;
|
|
default:
|
|
$ermsg = $sourceImageAttr['mime'].' images are not supported';
|
|
break;
|
|
}
|
|
|
|
if (isset($ermsg) || false === $oImage)
|
|
return $ermsg;
|
|
|
|
if ($maxWidth > 0 && $maxHeight > 0) {
|
|
$xscale = imagesx($oImage) / $maxWidth;
|
|
$yscale = imagesy($oImage) / $maxHeight;
|
|
} else if ($maxWidth > 0) {
|
|
$xscale = imagesx($oImage) / $maxWidth;
|
|
$yscale = $xscale;
|
|
} else if ($maxHeight > 0) {
|
|
$yscale = imagesy($oImage) / $maxHeight;
|
|
$xscale = $yscale;
|
|
} else {
|
|
$yscale = 1;
|
|
$xscale = 1;
|
|
}
|
|
|
|
if ($yscale > $xscale) {
|
|
$newWidth = round(imagesx($oImage) * (1/$yscale));
|
|
$newHeight = round(imagesy($oImage) * (1/$yscale));
|
|
} else {
|
|
$newWidth = round(imagesx($oImage) * (1/$xscale));
|
|
$newHeight = round(imagesy($oImage) * (1/$xscale));
|
|
}
|
|
|
|
$resizeRequired =
|
|
$newWidth > 0
|
|
&&
|
|
($resizeOnLess || $newWidth < imagesx($oImage))
|
|
&&
|
|
$xscale != 1;
|
|
|
|
if ($resizeRequired) {
|
|
// Resize is required
|
|
$newImage = imagecreatetruecolor($newWidth, $newHeight);
|
|
imagealphablending($newImage, false);
|
|
imagesavealpha($newImage, true);
|
|
imagecopyresampled($newImage, $oImage, 0, 0, 0, 0, $newWidth, $newHeight, imagesx($oImage), imagesy($oImage));
|
|
$oImage = $newImage;
|
|
}
|
|
|
|
if (!$resizeself) {
|
|
$sourceFileArr=explode('.',$sourceFile);
|
|
$sourceFileArr[count($sourceFileArr)-2].='_small';
|
|
$destFile=implode('.',$sourceFileArr);
|
|
} else {
|
|
if ($resizeRequired)
|
|
unlink($sourceFile);
|
|
$destFile = $sourceFile;
|
|
}
|
|
|
|
if ($resizeRequired) {
|
|
switch ($sourceImageAttr['mime']) {
|
|
case 'image/gif':
|
|
imagegif($oImage, $destFile);
|
|
break;
|
|
case 'image/jpeg':
|
|
imagejpeg($oImage, $destFile, $config['JPEGQuality']);
|
|
break;
|
|
case 'image/png':
|
|
imagepng($oImage, $destFile);
|
|
break;
|
|
case 'image/wbmp':
|
|
imagewbmp($oImage, $destFile);
|
|
break;
|
|
}
|
|
} else if ($destFile != $sourceFile) {
|
|
copy($sourceFile, $destFile);
|
|
}
|
|
|
|
@imageDestroy($oImage);
|
|
@imageDestroy($newImage);
|
|
return null;
|
|
}
|
|
|
|
function run() {
|
|
global $config;
|
|
if (!isset($config)) {
|
|
$result = array(false, 'Uploader\'s config not found. Check globals are on your server');
|
|
} else {
|
|
|
|
// Original image resize options
|
|
$imgEnlarge = false;
|
|
if (isset($_GET['ie']))
|
|
if ($_GET['ie'] == '1')
|
|
$imgEnlarge = true;
|
|
else
|
|
fail("Image Resize (ie) value is incorrect (" . $_GET['ie'] . ")");
|
|
$imgWidth = 0;
|
|
if (isset($_GET['iw']))
|
|
$imgWidth = $_GET['iw'];
|
|
if (preg_match('/^\d{1, 5}$/', $imgWidth) != null)
|
|
fail("Image Width (iw) value is not positive integer number (" . $imgWidth . ")");
|
|
if ($imgWidth > $config['MaxImgResizeWidth'])
|
|
fail("Image Width (iw) value is too big (" . $imgWidth . ")");
|
|
$imgHeight = 0;
|
|
if (isset($_GET['ih']))
|
|
$imgHeight = $_GET['ih'];
|
|
if (preg_match('/^\d{1, 5}$/', $imgHeight) != null)
|
|
fail("Image Height (ih) value is not positive integer number (" . $imgHeight . ")");
|
|
if ($imgHeight > $config['MaxImgResizeHeight'])
|
|
fail("Image Height (ih) value is too big (" . $imgHeight . ")");
|
|
|
|
// Thumbnail resize options
|
|
$thumbEnlarge = false;
|
|
if (isset($_GET['te']))
|
|
if ($_GET['te'] == '1')
|
|
$thumbEnlarge = true;
|
|
else
|
|
fail("Thumbnail Resize (te) value is incorrect (" . $_GET['te'] . ")");
|
|
$thumbWidth = 0;
|
|
if (isset($_GET['tw']))
|
|
$thumbWidth = $_GET['tw'];
|
|
if (preg_match('/^\d{1, 5}$/', $thumbWidth) != null)
|
|
fail("Thumbnail Width (tw) value is not positive integer number (" . $thumbWidth . ")");
|
|
if ($thumbWidth > $config['MaxThumbResizeWidth'])
|
|
fail("Thumbnail Width (tw) value is too big (" . $thumbWidth . ")");
|
|
$thumbHeight = 0;
|
|
if (isset($_GET['th']))
|
|
$thumbHeight = $_GET['th'];
|
|
if (preg_match('/^\d{1, 5}$/', $thumbHeight) != null)
|
|
fail("Thumbnail Height (th) value is not positive integer number (" . $thumbHeight . ")");
|
|
if ($thumbHeight > $config['MaxThumbResizeHeight'])
|
|
fail("Thumbnail Height (th) value is too big (" . $thumbHeight . ")");
|
|
|
|
$doThumb = $_GET['type']=='Images' && isset($_GET['makeThumb']);
|
|
|
|
$result = upload(
|
|
$doThumb,
|
|
$imgEnlarge,
|
|
$imgWidth,
|
|
$imgHeight,
|
|
$thumbEnlarge,
|
|
$thumbWidth,
|
|
$thumbHeight
|
|
);
|
|
}
|
|
|
|
sendResponse(
|
|
$result,
|
|
$config['BaseUrl']
|
|
);
|
|
}
|
|
|
|
run();
|
|
|
|
?>
|