2016-02-04 62 views
1

啞劇「圖像/ JPEG」在這一點上,我很困惑的東西的圖像稱爲這-thing.png(如PNG24創造出來的Photoshop CS5的 ),作爲image/jpeg上傳到kcfinderPHP PNG圖像上載與KCFINDER 3.12

enter image description here

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 \ core \ class \ browser.php函數moveUploadFile(作爲參數$文件)... mm類型從tm p_name以JPEG形式出現,而不是以PNG形式出現。

修飾功能,用於測試目的,包括從getimagesize() not returning 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/目錄。

enter image description here

我已經加入.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功能功能_.initUploadButton =函數中使用的形式()是你的基本,上傳形式。

<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圖像。

enter image description here

結果(基於上面的代碼)。

enter image description here

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支持(回覆爲馬克曼)

if (imagetypes() & IMG_PNG) { 
    echo "PNG Supported"; 
} else { 
    echo "PNG not supported."; 
} 

編輯:我發現,其中圖像被從PNG轉換爲JPG

如果checkUploadedFile在期間被註釋掉文件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.

+1

這是什麼輸出? 'if(imagetypes()&IMG_PNG){echo「PNG Supported」; }其他{回聲「PNG不支持。」; }' – mkaatman

+0

@mkaatman'PNG Supported' – Killrawr

+0

如果是這樣,你的'var_dump($ file);'它是你期望的文件嗎?不知何故,我懷疑你運行的是錯誤的文件,或者你的某個方法正在改變文件。 'pp_array()'做什麼? – mkaatman

回答

0

這是非常困惑的問題,我有。但我已經設法修復它。所涉及

步驟如下

打開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.phpkcfinder/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); 
} 

結果:

http://iforce.co.nz/i/q2r5xjr0.b52.png