Вход Регистрация
Файл: mg-core/lib/upload.php
Строк: 184
<?php

/**
 * Класс для загрузки изображений на сервер, в том числе и через ckeditor.
 *
 * @author Авдеев Марк <mark-avdeev@mail.ru>
 * @package moguta.cms
 * @subpackage Libraries
 */
class Upload {

  public 
$lang = array();

  public function 
__construct($ckeditMode = true) {

    include(
'mg-admin/locales/'.MG::getOption('languageLocale').'.php');
    
$this->lang = $lang;
    if (
$ckeditMode) {
      
$uploaddir = 'uploads';
      
$arrData = $this->addImage();
      
$msg = $arrData['msg'];
      if (
$arrData['status'] == "error") {
        echo 
'<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$_REQUEST['CKEditorFuncNum'].',  "'.$full_path.'","'.$arrData['msg'].'" );</script>';
      } else {
        
$full_path = SITE.'/uploads/'.$arrData['actualImageName'];
        echo 
'<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction("'.$_REQUEST['CKEditorFuncNum'].'",  "'.$full_path.'","'.$arrData['msg'].'" );</script>';
      }
    }
  }

  
/**
   * Загружает картинку из формы на сервер
   * @return boolean
   */
  
public function addImage($productImg = false, $watermark = false) {

    
$path = 'uploads/';


    
$validFormats = array('jpeg', 'jpg', 'png', 'gif', 'JPG');
    if (
$watermark) {
      
$path.="watermark/";
      if (!
file_exists('uploads/watermark/')) {
        if (
is_writable('uploads/')) {
          
chdir('uploads/'); //путь где создавать папку        
          
mkdir('watermark', 755); //имя папки и атрибуты на папку    
          
return array('msg' => "Папка для знака была восстановлена. Теперь можно загрузить картинку.", 'status' => 'success');
        }
      }
      
$validFormats = array('png');
    }

    if (isset(
$_POST) && 'POST' == $_SERVER['REQUEST_METHOD']) {

      if (!empty(
$_FILES['upload'])) {
        
$file_array = $_FILES['upload'];
      } elseif (!empty(
$_FILES['photoimg'])) {
        
$file_array = $_FILES['photoimg'];
      } else {
        
$file_array = $_FILES['edit_photoimg'];
      }

      
$name = $file_array['name'];
      
$size = $file_array['size'];

      if (
strlen($name)) {
        
//list($txt, $ext) = explode('.', $name);
        
$fullName = explode('.', $name);
        
$ext = array_pop($fullName);
        
$name = implode('.', $fullName);
        if (
in_array(strtolower($ext), $validFormats)) {
          if (
$size < (1024 * 5 * 1024) && !empty($file_array['tmp_name'])) { //$file_array['tmp_name'] будет пустым если размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini
            
$name = str_replace(" ", "-", $name);
            
$name = MG::translitIt($name);
            
$actualImageName = $this->prepareName($name, $ext);
            if (
$watermark) {
              
$actualImageName = 'watermark.png';
            }
            
$tmp = $file_array['tmp_name'];

            if (
move_uploaded_file($tmp, $path.$actualImageName)) {

              if (
MG::getSetting("waterMark") == "true" && !$watermark) {
                if (empty(
$_POST['noWaterMark'])) {
                  
$this->addWatterMark($path.$actualImageName);
                }
              }

              
//если картинка заливаются для продукта, то делаем две миниатюры
              
if ($productImg && !$watermark) {
                
//подготовка миниатюр с заданными в настройках размерами
                // preview по заданным в настройках размерам
                
$widthPreview = MG::getSetting('widthPreview') ? MG::getSetting('widthPreview') : 200;
                
$widthSmallPreview = MG::getSetting('widthSmallPreview') ? MG::getSetting('widthSmallPreview') : 50;
                
$heightPreview = MG::getSetting('heightPreview') ? MG::getSetting('heightPreview') : 100;
                
$heightSmallPreview = MG::getSetting('heightSmallPreview') ? MG::getSetting('heightSmallPreview') : 50;
                
$this->_reSizeImage('70_'.$actualImageName, $path.$actualImageName, $widthPreview, $heightPreview);
                
// миниатюра по размерам из БД (150*100)
                
$this->_reSizeImage('30_'.$actualImageName, $path.$actualImageName, $widthSmallPreview, $heightSmallPreview);
              }

              return array(
'msg' => $this->lang['ACT_IMG_UPLOAD'], 'actualImageName' => $actualImageName, 'status' => 'success');
            } else {
              return array(
'msg' => $this->lang['ACT_IMG_NOT_UPLOAD'], 'status' => 'error');
            }
          } else {
            return array(
'msg' => $this->lang['ACT_IMG_NOT_UPLOAD1'], 'status' => 'error');
          }
        } else {
          return array(
'msg' => $this->lang['ACT_IMG_NOT_UPLOAD2'], 'status' => 'error');
        }
      } else {
        return array(
'msg' => $this->lang['ACT_IMG_NOT_UPLOAD3'], 'status' => 'error');
      }
    }
    return 
false;
  }

  
/**
   * Проверяет существует ли уже в папке uploads файл с таким же именем.
   * Чтобы не перезатереть его  имя текущего файла будет дополненно индексом.
   * @return boolean
   */
  
public function prepareName($name, $ext) {
    if (
file_exists('uploads/'.$name.".".$ext)) {
      return 
$name.time().".".$ext;
    }
    return 
$name.".".$ext;
  }

  
/**
   * Функция для ресайза картинки
   * @param string $name имя файла без расширения
   * @param string $tmp исходный временный файл
   * @param int $widthSet заданная ширина изображения
   * @param int $heightSet заданная высота изображения
   * @paramint $koef коэффициент сжатия изображения
   * @return void
   */
  
public function _reSizeImage($name, $tmp, $widthSet, $heightSet, $dirUpload = 'uploads/thumbs/') {
    
$fullName = explode('.', $name);
    
$ext = array_pop($fullName);
    
$name = implode('.', $fullName);
    list(
$width_orig, $height_orig) = getimagesize($tmp);

    if (
$widthSet < $heightSet) {
      
$ratio = $widthSet / $width_orig;
      
$width = $widthSet;
      
$height = $height_orig * $ratio;
    } else {
      
$ratio = $heightSet / $height_orig;
      
$width = $width_orig * $ratio;
      
$height = $heightSet;
    }

    
// ресэмплирование
    
$image_p = imagecreatetruecolor($width, $height);


    
imageAlphaBlending($image_p, false);
    
imageSaveAlpha($image_p, true);


    
// вывод
    
switch ($ext) {
      case 
'png':
        
$image = imagecreatefrompng($tmp);
        
//делаем фон изображения белым, иначе в png при прозрачных рисунках фон черный
        
$black = imagecolorallocate($image, 0, 0, 0);

// Сделаем фон прозрачным
        
imagecolortransparent($image, $black);

        
imagealphablending($image_p, false);
        
$col = imagecolorallocate($image_p, 0, 0, 0);
        
imagefilledrectangle($image_p, 0, 0, $width, $height, $col);
//imagealphablending( $image_p, true );



        
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        
imagepng($image_p, $dirUpload.$name.'.'.$ext);
        break;

      case 
'gif':
        
$image = imagecreatefromgif($tmp);
        
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        
imagegif($image_p, $dirUpload.$name.'.'.$ext, 100);
        break;

      default:

        
$image = imagecreatefromjpeg($tmp);
        
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        
//imagefilter($image_p, IMG_FILTER_BRIGHTNESS, 15); 
        
imagejpeg($image_p, $dirUpload.$name.'.'.$ext, 100);
      
// создаём новое изображение
    
}
    
imagedestroy($image_p);
    
imagedestroy($image);
  }

  
/**
   * Добавляет водяной знак к картинке
   * @param type $image - путь до картинки на сервере
   * @return boolean
   */
  
public function addWatterMark($image) {
    
$filename = $image;
    if (!
file_exists('uploads/watermark/watermark.png')) {
      return 
false;
    }
    
$size_format = getimagesize($image);
    
$format = strtolower(substr($size_format['mime'], strpos($size_format['mime'], '/') + 1));

    
// создаём водяной знак
    
$watermark = imagecreatefrompng('uploads/watermark/watermark.png');
    
imagealphablending($watermark, false);
    
imageSaveAlpha($watermark, true);
    
// получаем значения высоты и ширины водяного знака
    
$watermark_width = imagesx($watermark);
    
$watermark_height = imagesy($watermark);

    
// создаём jpg из оригинального изображения
    
$image_path = $image;



    switch (
$format) {
      case 
'png':
        
$image = imagecreatefrompng($image_path);
        
$w = imagesx($image);
        
$h = imagesy($image);
        
$imageTrans = imagecreatetruecolor($w, $h);
        
imagealphablending($imageTrans, false);
        
imageSaveAlpha($imageTrans, true);


        
$col = imagecolorallocate($imageTrans, 0, 0, 0);
        
imagefilledrectangle($imageTrans, 0, 0, $w, $h, $col);
        
imagealphablending($imageTrans, true);


        break;
      case 
'gif':
        
$image = imagecreatefromgif($image_path);
        break;
      default:
        
$image = imagecreatefromjpeg($image_path);
    }

    
//если что-то пойдёт не так
    
if ($image === false) {
      return 
false;
    }
    
$size = getimagesize($image_path);
    
// помещаем водяной знак на изображение
    
$dest_x = (($size[0]) / 2) - (($watermark_width) / 2);
    
$dest_y = (($size[1]) / 2) - (($watermark_height) / 2);

    
imagealphablending($image, true);
    
imagealphablending($watermark, true);

    
imageSaveAlpha($image, true);
    
// создаём новое изображение
    
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

    
$imageformat = 'image'.$format;
    if (
$format = 'png') {
      
$imageformat($image, $filename);
    } else {
      
$imageformat($image, $filename, 100);
    }

    
// освобождаем память
    
imagedestroy($image);
    
imagedestroy($watermark);
    return 
true;
  }

  
/**
   * Загружает CSV файл для импорта каталога
   * @return boolean
   */
  
public function addImportCatalogCSV() {

    
$path = 'uploads/';
    
$validFormats = array('csv', 'zip');

    if (isset(
$_POST) && 'POST' == $_SERVER['REQUEST_METHOD']) {

      if (!empty(
$_FILES['upload'])) {
        
$file_array = $_FILES['upload'];
      }

      
$name = $file_array['name'];
      
$size = $file_array['size'];

      if (
strlen($name)) {
        
$fullName = explode('.', $name);
        
$ext = array_pop($fullName);
        
$name = implode('.', $fullName);
        if (
in_array(strtolower($ext), $validFormats)) {
          if (
$size < (1024 * 10 * 1024) && !empty($file_array['tmp_name'])) { //$file_array['tmp_name'] будет пустым если размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini
            
if (strtolower($ext) == 'csv') {
              
$name = 'importCatalog.csv';
            }
            if (
strtolower($ext) == 'zip') {
              
$name = 'importCatalog.zip';
            }

            
$tmp = $file_array['tmp_name'];

            if (
move_uploaded_file($tmp, $path.$name)) {

              if (
strtolower($ext) == 'zip') {
                if (
file_exists($path.$name)) {
                  
$zip = new ZipArchive;
                  
$res = $zip->open($path.$name, ZIPARCHIVE::CREATE);
                  
                  if (
$res === TRUE) {
                    
//$realDocumentRoot = str_replace(DIRECTORY_SEPARATOR.'mg-core'.DIRECTORY_SEPARATOR.'lib', '', dirname(__FILE__));
                    
for($i = 0; $i < $zip->numFiles; $i++) {
                      
$filename = $zip->getNameIndex($i);
                      
$fullName = explode('.', $zip->getNameIndex($i));
                      
$ext = array_pop($fullName);
                      if(
$ext=='csv'){
                        
$zip->extractTo('uploads/', array($filename));
                        
rename('uploads/'.$filename, "uploads/importCatalog.csv");
                      }                      
                    }                
                    
$zip->close();
                    
unlink($path.$name);
                  }
                }
              }
              return array(
'msg' => $this->lang['ACT_FILE_UPLOAD'], 'actualImageName' => 'importCatalog.csv', 'status' => 'success');
            } else {
              return array(
'msg' => $this->lang['ACT_FILE_NOT_UPLOAD'], 'status' => 'error');
            }
          } else {
            return array(
'msg' => $this->lang['ACT_FILE_NOT_UPLOAD1'], 'status' => 'error');
          }
        } else {
          return array(
'msg' => $this->lang['ACT_FILE_NOT_UPLOAD2'], 'status' => 'error');
        }
      } else {
        return array(
'msg' => $this->lang['ACT_FILE_NOT_UPLOAD3'], 'status' => 'error');
      }
    }
    return 
false;
  }

}
Онлайн: 2
Реклама