Skip to content

Instantly share code, notes, and snippets.

@nergal
Created March 16, 2011 14:46
Show Gist options
  • Save nergal/872595 to your computer and use it in GitHub Desktop.
Save nergal/872595 to your computer and use it in GitHub Desktop.
<?php
/**
* Аплоад файла с расширенной проверкой типа
*
* @throws Zend_File_Transfer_Exception
* @param string $filename
* @param array $allowed_types
* @return string
*/
private function upload($filename, Array $allowed_types)
{
$parts = getimagesize($filename);
if ($parts AND isset($allowed_types[$parts['mime']])) {
if (file_exists($filename)) {
// Проверка на размер файла
// (в php.ini (upload_max_filesize и post_max_size) и в nginx.conf (client_max_body_size) всегда должно
// быть значение больше, чтобы сервер не перекрыл этот обработчик)
if (filesize($filename) > 2048000) {
throw new Zend_File_Transfer_Exception('Размер изображения не должен превышать 2 мегабайта.');
}
// Вычисление нового имени файла - его хэш и случайное значение
// (чтобы одинаковые фотки разных пользователей были разными физически)
$fname = md5_file($filename) . uniqid() . "." . $allowed_types[$parts['mime']];
// Формирование имени файла:
// папка(два первых символа хэша), под папка(черыре симвоа со второй позиции)
$dest = realpath(APPLICATION_PATH . "/../public/pictures/galleries/");
$dest.= "/" . substr($fname, 0, 2) . "/" . substr($fname, 2, 4) . "/";
// Рекурсивное создание директорий, если их нет
if (!is_dir($dest)) {
mkdir($dest, 0777, true);
}
// Ресайз фотки, если она больше 650x768
$image = new Fan_Image_Transform($filename, new Fan_Image_Driver_Gd);
if($image->getWidth() > 650) {
$image->fitToWidth(650)->save($filename);
}
if($image->getHeight() > 768) {
$image->fitToHeight(768)->save($filename);
}
// Перенос файла в постоянное место из временной папки
move_uploaded_file($filename, "{$dest}{$fname}");
return $fname;
}
}
return FALSE;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment