From 8230ffd6d0692311f4a9b47e24c92596440dccbb Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Feb 2016 16:22:24 +0800 Subject: [PATCH] * finish task #2465. --- module/file/config.php | 1 + module/file/control.php | 10 +++- module/file/model.php | 111 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 120 insertions(+), 2 deletions(-) diff --git a/module/file/config.php b/module/file/config.php index d6ba555602..e05ead0dab 100644 --- a/module/file/config.php +++ b/module/file/config.php @@ -5,3 +5,4 @@ $config->file->mimes['csv'] = 'text/csv'; $config->file->mimes['default'] = 'application/octet-stream'; $config->file->imageExtensions = array('jpeg', 'jpg', 'gif', 'png'); +$config->file->imageFmt = array('.jpg', '.bmp', '.jpeg'); diff --git a/module/file/control.php b/module/file/control.php index 557fd1222b..3b8299f3ed 100644 --- a/module/file/control.php +++ b/module/file/control.php @@ -51,13 +51,21 @@ class file extends control if($file['size'] == 0) die(json_encode(array('error' => 1, 'message' => $this->lang->file->errorFileUpload))); if(@move_uploaded_file($file['tmpname'], $this->file->savePath . $file['pathname'])) { - $url = $this->file->webPath . $file['pathname']; + /* Compress image for jpg and bmp. */ + $compressedImage = $this->file->compressImage($file['pathname']); + if($compressedImage) + { + $file['pathname'] = $compressedImage['pathname']; + $file['extension'] = $compressedImage['extension']; + $file['size'] = $compressedImage['size']; + } $file['addedBy'] = $this->app->user->account; $file['addedDate'] = helper::today(); unset($file['tmpname']); $this->dao->insert(TABLE_FILE)->data($file)->exec(); + $url = $this->file->webPath . $file['pathname']; die(json_encode(array('error' => 0, 'url' => $url))); } else diff --git a/module/file/model.php b/module/file/model.php index 1d46dd47e8..f75a0cc1fe 100644 --- a/module/file/model.php +++ b/module/file/model.php @@ -78,6 +78,14 @@ class fileModel extends model { if($file['size'] == 0) continue; move_uploaded_file($file['tmpname'], $this->savePath . $file['pathname']); + $compressedImage = $this->compressImage($file['pathname']); + if($compressedImage) + { + $file['pathname'] = $compressedImage['pathname']; + $file['extension'] = $compressedImage['extension']; + $file['size'] = $compressedImage['size']; + } + $file['objectType'] = $objectType; $file['objectID'] = $objectID; $file['addedBy'] = $this->app->user->account; @@ -238,10 +246,11 @@ class fileModel extends model $realPathName= $this->savePath . $pathName; if(!is_dir(dirname($realPathName)))mkdir(dirname($realPathName)); move_uploaded_file($file['tmpname'], $realPathName); + $this->compressImage($pathName); $fileInfo->addedBy = $this->app->user->account; $fileInfo->addedDate = helper::now(); - $fileInfo->size = $file['size']; + $fileInfo->size = filesize($realPathName); $this->dao->update(TABLE_FILE)->data($fileInfo)->where('id')->eq($fileID)->exec(); return true; } @@ -466,4 +475,104 @@ class fileModel extends model } return $data; } + + /** + * Compress image + * + * @param string $pathName + * @access public + * @return array + */ + public function compressImage($pathName) + { + if(!extension_loaded('gd')) return false; + + $fileName = $this->savePath . $pathName; + $suffix = strrchr($fileName, '.'); + $lowerSuffix = strtolower($suffix); + + if(!in_array($lowerSuffix, $this->config->file->imageFmt)) return false; + + $quality = 85; + $newSuffix = '.jpg'; + $compressedName = str_replace($suffix, $newSuffix, $pathName); + + $res = ''; + if($lowerSuffix == '.bmp') + { + $res = $this->imagecreatefrombmp($fileName); + } + else + { + $res = imagecreatefromjpeg($fileName); + } + + imagejpeg($res, $this->savePath . $compressedName, $quality); + if($fileName != $this->savePath . $compressedName) unlink($fileName); + + + return array('pathname' => $compressedName, 'extension' => ltrim($newSuffix, '.'), 'size' => filesize($this->savePath . $compressedName)); + } + + /** + * Read 24bit BMP files + * Author: de77 + * Licence: MIT + * Webpage: de77.com + * Version: 07.02.2010 + * Source : https://github.com/acustodioo/pic/blob/master/imagecreatefrombmp.function.php + * + * @param string $filename + * @access public + * @return resource + */ + public function imagecreatefrombmp($filename) { + $f = fopen($filename, "rb"); + + //read header + $header = fread($f, 54); + $header = unpack('c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/'. + 'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'. + 'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors', $header); + + if ($header['identifier1'] != 66 or $header['identifier2'] != 77) + return false; + + if ($header['bits_per_pixel'] != 24) + return false; + + $wid2 = ceil((3 * $header['width']) / 4) * 4; + + $wid = $header['width']; + $hei = $header['height']; + + $img = imagecreatetruecolor($header['width'], $header['height']); + + //read pixels + for ($y = $hei - 1; $y >= 0; $y--) { + $row = fread($f, $wid2); + $pixels = str_split($row, 3); + + for ($x = 0; $x < $wid; $x++) { + imagesetpixel($img, $x, $y, $this->dwordize($pixels[$x])); + } + } + fclose($f); + return $img; + } + + /** + * Dwordize for imagecreatefrombmp + * + * @param streing $str + * @access private + * @return int + */ + private function dwordize($str) + { + $a = ord($str[0]); + $b = ord($str[1]); + $c = ord($str[2]); + return $c * 256 * 256 + $b * 256 + $a; + } }