February 26, 2012

Мультизагрузчик изображений на базе swfupload

Выкладываю сюда мультизагрузчик изображений на основе swfipload. Изначально это был пример с сайта simplecoding.org, но я его немного модифицировал добавив ресайз картинок в превьюшки размером по 500 пикселей в ширину. Индивидуальные настройки скрипта можете проводить в файле upload.php и js/main.js

Листинг файла upload.php:

<?php
$uploadDir = 'img/'; //папка для хранения файлов
$dir = '/i/'; //базовый путь к скрипту
$mwidth = 500; //ширина превью в пикселях

$allowedExt = array('jpg', 'jpeg', 'png', 'gif');
$maxFileSize = 2 * 1024 * 1024; //2 MB

//если получен файл
if (isset($_FILES)) {
    //проверяем размер и тип файла
    $ext = end(explode('.', strtolower($_FILES['Filedata']['name'])));
    if (!in_array($ext, $allowedExt)) {
        return;
    }
    if ($maxFileSize < $_FILES['Filedata']['size']) {
        return;
    }
    if (is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
        //Магия с созданием уникального имени. Начало
        $fileName = $uploadDir.$_FILES['Filedata']['name'];
        $nameParts = explode('.', $_FILES['Filedata']['name']);
        $nameParts[count($nameParts)-2] =substr(md5(time()),7);
        $fileName = $uploadDir.implode('.', $nameParts);
        //если файл с таким именем уже существует... Невероятное! =)
        while(file_exists($fileName)) {
            //...добавляем текущее время к имени файла
            $nameParts = explode('.', $_FILES['Filedata']['name']);
            $nameParts[count($nameParts)-2] =substr(md5(time()),7);
            $fileName = $uploadDir.implode('.', $nameParts);
        }
        //Генерим путь к mini
        $dirParts=explode('/',$fileName);
        $dirParts[0].="/mini";
        $fileName2 = implode('/',$dirParts);

        //Магия с созданием уникального имени. Конец
        move_uploaded_file($_FILES['Filedata']['tmp_name'], $fileName);
        //Костыль ресайза картинок до width:500px; начало
        // Get new sizes
        list($width, $height) = getimagesize($fileName);
        if($width\>$mwidth) {
            $newwidth=$mwidth;
            $k=$newwidth/$width;
            $newheight = $height \* $k;
            // Load
            $thumb = imagecreatetruecolor($newwidth, $newheight);
            $source = imagecreatefromjpeg($fileName);

            // Resize
            imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            imagejpeg($thumb, $fileName2);
            $ext='\<a href="'.$dir.$fileName.'"\>\<img src="'.$dir.$fileName2.'"/\>\</a\>';
            echo $ext."\<br/\>";
            echo '\<input type="text" size="150" value="'.htmlspecialchars($ext).'"\>\<br /\>';
        }
        //Костыль ресайза картинок до width:500px; конец
        else {
            $ext='\<img src="'.$dir.$fileName.'"/\>';
        echo $ext."\<br/\>";
        echo '\<input type="text" size="150" value="'.htmlspecialchars($ext).'"\>\<br /\>';
        }
    }
}

Полный пример скрипта: i.zip

UPD: Изменил imagecopyresized на imagecopyresampled чтобы ресайзнутые изображения выглядели получше.

Актуальная версия скрипта на GitHub - https://github.com/rhamdeew/mod-swfupload