在这一点上,我对一个名为this-thing.png的图像(从photoshop CS5创建为 PNG24 )上传到kcfinder
as感到非常困惑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[(key($_FILES)]['tmp_name']中的变量数据到达kcfinder\core\class\browser.php函数moveUploadFile(作为参数$file)...来自 tmp_name 的 mime 类型以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();
}
结果,在文件this-thing.png的上传过程中,显示媒体类型实际上是JPG而不是PNG(这是部分,我似乎无法理解)。
(来源:iforce.co.nz)
显然这个文件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/cache/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
被注释掉PNG....moveUploadFile
this-thing.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.