На данный момент, я очень смущен для чего-то изображение под названием это-thing.png (созданный как PNG24 из фотошоп CS5), загружается в kcfinder
как image/jpeg
,
Проанализировано с TriID, показывает изображение полностью 100% PNG
C:\TrID>trid C:\users\michael\downloads\this-thing.png
TrID/32 - File Identifier v2.20 - (C) 2003-15 By M.Pontello
Definitions found: 3790
Analyzing...
Collecting data from file: C:\users\michael\downloads\this-thing.png
100.0% (.PNG) Portable Network Graphics (16000/1)
Но когда переменные данные внутри $ _FILES [(ключ ($ _ FILES)] [ ‘tmp_name’], достигает kcfinder \ ядро \ класс \ browser.php функция moveUploadFile (как аргумент $ файл) … MIME-тип из tmp_name выглядит как JPEG, а не как PNG.
Модифицированная функция для тестирования включала в себя код getimagesize () не возвращает false
protected function moveUploadFile($file, $dir) {
$message = $this->checkUploadedFile($file);
if ($message !== true) {
if (isset($file['tmp_name']))
@unlink($file['tmp_name']);
return "{$file['name']}: $message";
}
$filename = $this->normalizeFilename($file['name']);
$target = "$dir/" . file::getInexistantFilename($filename, $dir);
echo "<h3>PHP_FILES foreach</h3>";
foreach ($_FILES['upload']['name'] as $key => $value){
echo "<pre>";
print_r(getimagesize($_FILES['upload']['tmp_name'][$key]));
echo "</pre>";
}
echo "<h3>TEMP FILE</h3>";
echo "</strong>file variable</strong>";
echo "<pre>";
print_r($file);
echo "</pre>";
echo "</strong>file.tmp_name</strong>";
echo "<pre>";
print_r($file['tmp_name']);
echo "</pre>";
$tmp_name_imagesize = getimagesize($file['tmp_name']);
echo "<pre>";
print_r($tmp_name_imagesize);
echo "</pre>";
if (imagetypes() & IMG_PNG) { echo "PNG Supported"; } else { echo "PNG not supported."; }
// mkaatman - move tmp file to /tmp/ to check its MD5SUM result
$temporary_file_path = $file['tmp_name'] . ".uploaded";
move_uploaded_file($file['tmp_name'], $temporary_file_path);
die();
}
Результат, при загрузке файла это-thing.png, показывает, что тип носителя на самом деле JPG и не PNG (это та часть, которую я не могу обернуть вокруг)
http://iforce.co.nz/i/kgcgf2af.pyo.png
Видимо этот файл php92C2.tmp.uploaded
загруженный файл, в /tmp/
каталог.
я добавил .png
в конец файла, используя Windows Rename
, для целей анализа файлов.
C:\TrID>trid C:\users\michael\downloads\php92C2.tmp.uploaded.png
TrID/32 - File Identifier v2.20 - (C) 2003-15 By M.Pontello
Definitions found: 3790
Analyzing...
Collecting data from file: C:\users\michael\downloads\php92C2.tmp.uploaded.png
50.0% (.JPG) JFIF JPEG Bitmap (4003/3)
37.4% (.JPG) JPEG Bitmap (3000/1)
12.4% (.MP3) MP3 audio (1000/1)
Но если изображение тестируется напрямую через PHP (копирование + вставка в каталог)
<?php
$image_file = "this-thing.png";
$image_file_details = getimagesize($image_file);
echo "<pre>";
print_r($image_file_details);
echo "</pre>";
?>
В результате получается, что изображение на самом деле PNG.
Array
(
[0] => 800
[1] => 300
[2] => 3
[3] => width="800" height="300"[bits] => 8
[mime] => image/png
)
Форма, используемая в kcfinder / кэш / base.js функция function _.initUploadButton = function () ваша основная форма загрузки.
<div id="upload" style="top:5px;width:77px;height:31px">
<form enctype="multipart/form-data" method="post" target="uploadResponse" action="browse.php?type=image&lng=en&opener=ckeditor&act=upload"><input type="file" name="upload[]" onchange="_.uploadFile(this.form)" style="height:31px" multiple="multiple" /><input type="hidden" name="dir" value="" /></form>
</div>
Наконец, некоторая информация из KCFINDER.Config из php
CONFIG.imageDriversPriority
imagick gmagick gd
CONFIG.deniedExts
exe com msi bat php phps phtml php3 php4 cgi pl htaccess htm html
CONFIG.types
Array
(
[image] => 7z aiff asf avi bmp csv doc fla flv gif gz gzip jpeg jpg mid mov mp3 mp4 mpc mpeg mpg ods odt pdf png ppt pxd qt ram rar rm rmi rmvb rtf sdc sitd swf sxc sxw tar tgz tif tiff txt vsd wav wma wmv xls xml zip
[images] => 7z aiff asf avi bmp csv doc fla flv gif gz gzip jpeg jpg mid mov mp3 mp4 mpc mpeg mpg ods odt pdf png ppt pxd qt ram rar rm rmi rmvb rtf sdc sitd swf sxc sxw tar tgz tif tiff txt vsd wav wma wmv xls xml zip
[files] => 7z aiff asf avi bmp csv doc fla flv gif gz gzip jpeg jpg mid mov mp3 mp4 mpc mpeg mpg ods odt pdf png ppt pxd qt ram rar rm rmi rmvb rtf sdc sitd swf sxc sxw tar tgz tif tiff txt vsd wav wma wmv xls xml zip
[uploads] => 7z aiff asf avi bmp csv doc fla flv gif gz gzip jpeg jpg mid mov mp3 mp4 mpc mpeg mpg ods odt pdf png ppt pxd qt ram rar rm rmi rmvb rtf sdc sitd swf sxc sxw tar tgz tif tiff txt vsd wav wma wmv xls xml zip
[mimages] => *mime image/gif image/png image/jpeg
)
Основываясь на всей этой информации, я не могу понять, почему изображение, загружаемое в формате PNG, возвращается в формате JPEG.
РЕДАКТИРОВАТЬ: я проверил, kcfinder с использованием изображения, созданного из mspaint (это то, где это становится запутанным)
Протестированное изображение PNG.
Результат (на основе приведенного выше кода).
C:\TrID>trid C:\users\michael\Pictures\breaking-bad.png
TrID/32 - File Identifier v2.20 - (C) 2003-15 By M.Pontello
Definitions found: 3790
Analyzing...
Collecting data from file: C:\users\michael\Pictures\breaking-bad.png
100.0% (.PNG) Portable Network Graphics (16000/1)
C:\TrID>
РЕДАКТИРОВАТЬ: Поддержка PNG (ответ для markman)
if (imagetypes() & IMG_PNG) {
echo "PNG Supported";
} else {
echo "PNG not supported.";
}
РЕДАКТИРОВАТЬ: я нашел, где изображение преобразуется из PNG в JPG
если checkUploadedFile
закомментировано во время moveUploadFile
файл this-thing.png
выходит как положено PNG ….
protected function checkUploadedFile(array $aFile=null) {
$config = &$this->config;
$file = ($aFile === null) ? $this->file : $aFile;
if (!is_array($file) || !isset($file['name']))
return $this->label("Unknown error");
if (is_array($file['name'])) {
foreach ($file['name'] as $i => $name) {
$return = $this->checkUploadedFile(array(
'name' => $name,
'tmp_name' => $file['tmp_name'][$i],
'error' => $file['error'][$i]
));
if ($return !== true)
return "$name: $return";
}
return true;
}
$extension = file::getExtension($file['name']);
$typePatt = strtolower(text::clearWhitespaces($this->types[$this->type]));
// CHECK FOR UPLOAD ERRORS
if ($file['error'])
return
($file['error'] == UPLOAD_ERR_INI_SIZE) ?
$this->label("The uploaded file exceeds {size} bytes.",
array('size' => ini_get('upload_max_filesize'))) : (
($file['error'] == UPLOAD_ERR_FORM_SIZE) ?
$this->label("The uploaded file exceeds {size} bytes.",
array('size' => $_GET['MAX_FILE_SIZE'])) : (
($file['error'] == UPLOAD_ERR_PARTIAL) ?
$this->label("The uploaded file was only partially uploaded.") : (
($file['error'] == UPLOAD_ERR_NO_FILE) ?
$this->label("No file was uploaded.") : (
($file['error'] == UPLOAD_ERR_NO_TMP_DIR) ?
$this->label("Missing a temporary folder.") : (
($file['error'] == UPLOAD_ERR_CANT_WRITE) ?
$this->label("Failed to write file.") :
$this->label("Unknown error.")
)))));
// HIDDEN FILENAMES CHECK
elseif (substr($file['name'], 0, 1) == ".")
return $this->label("File name shouldn't begins with '.'");
// EXTENSION CHECK
elseif (
(substr($file['name'], -1) == ".") ||
!$this->validateExtension($extension, $this->type)
)
return $this->label("Denied file extension.");
// SPECIAL DIRECTORY TYPES CHECK (e.g. *img)
elseif (preg_match('/^\*([^ ]+)(.*)?$/s', $typePatt, $patt)) {
list($typePatt, $type, $params) = $patt;
$class = __NAMESPACE__ . "\\type_$type";
if (class_exists($class)) {
$type = new $class();
$cfg = $config;
$cfg['filename'] = $file['name'];
if (strlen($params))
$cfg['params'] = trim($params);
$response = $type->checkFile($file['tmp_name'], $cfg);
if ($response !== true)
return $this->label($response);
} else
return $this->label("Non-existing directory type.");
}
// IMAGE RESIZE
$img = image::factory($this->imageDriver, $file['tmp_name']);
if (!$img->initError && !$this->imageResize($img, $file['tmp_name']))
return $this->label("The image is too big and/or cannot be resized.");
return true;
}
Выход PNG Supported.
Это была довольно запутанная проблема, у меня была. Но мне удалось это исправить.
Шаги включают в себя следующие
Открыть файл kcfinder/core/class/uploader.php
найти функцию imageResize
, Затем измените this.output
код.
До:
// WRITE TO FILE
return $img->output("jpeg", array(
'file' => $file,
'quality' => $this->config['jpegQuality']
));
После:
// Check the EXTENSION OF THIS FILE
if($file && is_string($file) && file_exists($file)) {
$file_imgsize = @getimagesize($file);
// Get the EXPECTED EXTENSION from this MIME
if($file_imgsize && !empty($file_imgsize)) {
$fileMimeInteger = $file_imgsize[2];
$outputFileExtension = @image_type_to_extension($fileMimeInteger);
$outputFileExtension = str_replace('.', '', $outputFileExtension);
}
}
// Force Jpeg
if(!$outputFileExtension) {
$outputFileExtension = "jpeg";
}
// WRITE TO FILE
return $img->output($outputFileExtension, array(
'file' => $file,
'quality' => $this->config['jpegQuality']
));
Функция:
protected function imageResize($image, $file=null) {
if (!($image instanceof image)) {
$img = image::factory($this->imageDriver, $image);
if ($img->initError) return false;
$file = $image;
} elseif ($file === null) {
return false;
}
else {
$img = $image;
}
$orientation = 1;
if (function_exists("exif_read_data")) {
$orientation = @exif_read_data($file);
$orientation = isset($orientation['Orientation']) ? $orientation['Orientation'] : 1;
}
// IMAGE WILL NOT BE RESIZED WHEN NO WATERMARK AND SIZE IS ACCEPTABLE
if ((
!isset($this->config['watermark']['file']) ||
(!strlen(trim($this->config['watermark']['file'])))
) && (
(
!$this->config['maxImageWidth'] &&
!$this->config['maxImageHeight']
) || (
($img->width <= $this->config['maxImageWidth']) &&
($img->height <= $this->config['maxImageHeight'])
)
) &&
($orientation == 1)
)
return true;
// PROPORTIONAL RESIZE
if ((!$this->config['maxImageWidth'] || !$this->config['maxImageHeight'])) {
if ($this->config['maxImageWidth'] &&
($this->config['maxImageWidth'] < $img->width)
) {
$width = $this->config['maxImageWidth'];
$height = $img->getPropHeight($width);
} elseif (
$this->config['maxImageHeight'] &&
($this->config['maxImageHeight'] < $img->height)
) {
$height = $this->config['maxImageHeight'];
$width = $img->getPropWidth($height);
}
if (isset($width) && isset($height) && !$img->resize($width, $height))
return false;
// RESIZE TO FIT
} elseif (
$this->config['maxImageWidth'] && $this->config['maxImageHeight'] &&
!$img->resizeFit($this->config['maxImageWidth'], $this->config['maxImageHeight'])
)
return false;
// AUTO FLIP AND ROTATE FROM EXIF
if ((($orientation == 2) && !$img->flipHorizontal()) ||
(($orientation == 3) && !$img->rotate(180)) ||
(($orientation == 4) && !$img->flipVertical()) ||
(($orientation == 5) && (!$img->flipVertical() || !$img->rotate(90))) ||
(($orientation == 6) && !$img->rotate(90)) ||
(($orientation == 7) && (!$img->flipHorizontal() || !$img->rotate(90))) ||
(($orientation == 8) && !$img->rotate(270))
)
return false;
if (($orientation >= 2) && ($orientation <= 8) && ($this->imageDriver == "imagick"))
try {
$img->image->setImageProperty('exif:Orientation', "1");
} catch (\Exception $e) {}
// WATERMARK
if (isset($this->config['watermark']['file']) &&
is_file($this->config['watermark']['file'])
) {
$left = isset($this->config['watermark']['left'])
? $this->config['watermark']['left'] : false;
$top = isset($this->config['watermark']['top'])
? $this->config['watermark']['top'] : false;
$img->watermark($this->config['watermark']['file'], $left, $top);
}
// Check the EXTENSION OF THIS FILE
if($file && is_string($file) && file_exists($file)) {
$file_imgsize = @getimagesize($file);
// Get the EXPECTED EXTENSION from this MIME
if($file_imgsize && !empty($file_imgsize)) {
$fileMimeInteger = $file_imgsize[2];
$outputFileExtension = @image_type_to_extension($fileMimeInteger);
$outputFileExtension = str_replace('.', '', $outputFileExtension);
}
}
// Force Jpeg
if(!$outputFileExtension) {
$outputFileExtension = "jpeg";
}
// WRITE TO FILE
return $img->output($outputFileExtension, array(
'file' => $file,
'quality' => $this->config['jpegQuality']
));
}
Далее файл class_image_gd.php
в пути kcfinder/lib/class_image_gd.php
искать функцию output_png
внести изменения в то, как quality
разработан (это исправляет ошибку, связанную с PHP, с «Сжатие должно быть между 0-9»).
protected function output_png(array $options=array()) {
$file = isset($options['file']) ? $options['file'] : null;
$quality = isset($options['quality']) ? $options['quality'] : null;
$filters = isset($options['filters']) ? $options['filters'] : null;
if (($file === null) && !headers_sent()) {
header("Content-Type: image/png");
}
// Compression must be between 0-9 - 2/02/2016
if($quality && is_numeric($quality)) {
$quality = $quality < 100 ? round(($quality / 100) * 10) : null;
} else {
$quality = null;
}
return imagepng($this->image, $file, $quality, $filters);
}
Результат:
Других решений пока нет …