Упаковщик картинок в WordPress

Рубрика: Wordpress
Posted on: 11.04.2012 в 03:48 - 5 комментариев - Visited 10902 times

Я обновил упаковщик, теперь поддерживаются маймы (вызывало проблемы в некоторых браузерах и в флеш-проигрывателях) , теперь проверка файла на добавление в архиве более весомая и теперь файлы не должны исчезать как раньше. Упаковщик достаточно быстрый нормально работает даже с большими файлами, пример: http://ptipti.ru/природа/ тяжёлое видео.

Случилось так, что подлый хостер, обещающий безлимитное дисковое пространство, забыл уточнить, что неограничен объём, а вот количество файлов... Собственно с этим срочно надо было что-то делать. Благо есть WordPress, в котором очень в этом плане грамотно сделана структура загрузок и вообще все операции с картинками.

Вот и пришла в голову мысль, хранить все картинки в типа контейнерах. То есть в архиве и по требованию на лету их извлекать. Если вас это заинтересовало, с удовольствием был бы рад увидеть комментарии, отзывы и предложения.

ПРЕДУПРЕЖДАЮ ЗАРАНЕЕ - ТО ЧТО ВЫ СДЕЛАЕТЕ, ЭТО БУДЕТ СДЕЛАНО С ПОЛНОЙ ВАШЕЙ ОТВЕТСТВЕННОСТЬЮ И ПОНИМАНИЕМ, ЧТО АВТОР НЕ НЕСЁТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ПОРЧУ/УТРАТУ/ЧАСТИЧНУЮ УТРАТУ ИНФОРМАЦИИ.

Если вы решились установить дополнение, ПОЖАЛУЙСТА сделайте резервную копию всей папки "uploads" вашего WordPress и сохраните в укромное место.

На данный момент дополнение имеет состояние "Альфа" и устанавливается вручную. В последующем планируется  сделать дополнение в виде плагина, но это всё потом.

И так, вы сделали бекап папки "uploads" (как я просил ранее), сохранили его в укромное место. Точно сделали и точно сохранили. Чтоб потом не было слюней, соплей и проклятий в мой адрес. Теперь точно сделали? Тогда читаем дальше.

Создадим файл ".htaccess" в папке "uploads", впишем туда такие строки:

RewriteEngine On
RewriteRule .* index.php [L]

(Если вы используете веб-сервер, отличный от Apache, уточните как правильно написать рерайты для конкретной ситуации)

Рядом с ним (в папке "uploads") создадим файл "index.php" с таким содержимым:

<?php
$request = $_SERVER['REQUEST_URI'];
 
define('THSDR', dirname (__FILE__));
define('DS', DIRECTORY_SEPARATOR);
 
if (preg_match('/\/(\d{4}\/\d{2})\/([^\?]+)/', $request, $matches)) {
	$zip = new ZipArchive;
	$archive = THSDR.DS.str_replace('/', DS, $matches[1]).DS.'container.zip';
 
	$filename = str_replace('/', DS, $matches[2]);
	$file = THSDR.DS.str_replace('/', DS, $matches[1]).DS.$filename;
	$content = NULL;
 
 
	if (is_file($file)) {
		$content = file_get_contents($file);
		if (preg_match('/\-\d+x\d+/', $file)) {
			$glob = preg_replace('/\-\d+x\d+/', '*', $file);
		} else {
			$glob = preg_replace('/\.([^\.]+)$/', '*.$1', $file);
		}
 
		$files = glob($glob);
		if (!count($files)) $files[] = $file;
 
		if (!is_file($archive)) $result = $zip->open($archive, ZipArchive::CREATE);
		else $result = $zip->open($archive);
 
		if ($result === TRUE) {
			foreach ($files as $file) {
				$name = basename($file);
				if ($result === TRUE) {
					if ($zip->addFile($file, $name) === TRUE) continue;
				}
			}
			$zip->close();
 
			if ($zip->open($archive)) foreach ($files as $file) {
				$name = basename($file);
				if ($zip->getFromName($name) && is_file($file)) unlink($file);
			}
		}
	} else {
		if (($zip->open($archive)) === TRUE) {
			$content = $zip->getFromName($filename);
			$zip->close();
		}
	}
 
	if ($content) {
		$age = 24 * 3600 * 7;
		header('Expires: '.gmdate('D, d M Y H:i:s', time() + $age).' GMT');
		header('Cache-Control: public, max-age='.$age);
		header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($archive)).' GMT');
		if ($image = @imagecreatefromstring($content)) {
			if (!$no_watermark && is_file('watermark.png') && ($watermark = @imagecreatefrompng('watermark.png'))) {
				$w = imagesx($image);
				$h = imagesy($image);
 
				$ww = imagesx($watermark);
				$wh = imagesy($watermark);
 
				$x = $w - $ww;
				$y = $h - $wh;
				imagecopy($image, $watermark, $x, $y, 0, 0, $ww, $wh);
				imagedestroy($watermark);
			}
			header('Content-Type: image/jpeg');
			imagejpeg($image, null, 100);
			imagedestroy($image);
		} else {
			preg_match('/\.([^\.]+)$/', $filename, $ext);
			switch ($ext[1]) {
				case 'txt' : $mime = 'text/plain'; break;
				case 'htm' : $mime = 'text/html'; break;
				case 'html' : $mime = 'text/html'; break;
				case 'php' : $mime = 'text/html'; break;
				case 'css' : $mime = 'text/css'; break;
				case 'js' : $mime = 'application/javascript'; break;
				case 'json' : $mime = 'application/json'; break;
				case 'xml' : $mime = 'application/xml'; break;
				case 'swf' : $mime = 'application/x-shockwave-flash'; break;
				case 'flv' : $mime = 'video/x-flv'; break;
				case 'png' : $mime = 'image/png'; break;
				case 'jpe' : $mime = 'image/jpeg'; break;
				case 'jpeg' : $mime = 'image/jpeg'; break;
				case 'jpg' : $mime = 'image/jpeg'; break;
				case 'gif' : $mime = 'image/gif'; break;
				case 'bmp' : $mime = 'image/bmp'; break;
				case 'ico' : $mime = 'image/vnd.microsoft.icon'; break;
				case 'tiff' : $mime = 'image/tiff'; break;
				case 'tif' : $mime = 'image/tiff'; break;
				case 'svg' : $mime = 'image/svg+xml'; break;
				case 'svgz' : $mime = 'image/svg+xml'; break;
				case 'zip' : $mime = 'application/zip'; break;
				case 'rar' : $mime = 'application/x-rar-compressed'; break;
				case 'exe' : $mime = 'application/x-msdownload'; break;
				case 'msi' : $mime = 'application/x-msdownload'; break;
				case 'cab' : $mime = 'application/vnd.ms-cab-compressed'; break;
				case 'mp3' : $mime = 'audio/mpeg'; break;
				case 'qt' : $mime = 'video/quicktime'; break;
				case 'mov' : $mime = 'video/quicktime'; break;
				case 'pdf' : $mime = 'application/pdf'; break;
				case 'psd' : $mime = 'image/vnd.adobe.photoshop'; break;
				case 'ai' : $mime = 'application/postscript'; break;
				case 'eps' : $mime = 'application/postscript'; break;
				case 'ps' : $mime = 'application/postscript'; break;
				case 'doc' : $mime = 'application/msword'; break;
				case 'rtf' : $mime = 'application/rtf'; break;
				case 'xls' : $mime = 'application/vnd.ms-excel'; break;
				case 'ppt' : $mime = 'application/vnd.ms-powerpoint'; break;
				case 'odt' : $mime = 'application/vnd.oasis.opendocument.text'; break;
				case 'ods' : $mime = 'application/vnd.oasis.opendocument.spreadsheet'; break;
				default : $mime = 'application/octet-stream'; break;
			}
			header('Content-Type: '.$mime);
			echo $content;
		}
	}
} else {
	preg_match('/uploads\/([^\?]+)/i', $request, $matches);
	$file = THSDR.DS.str_replace('/', DS, $matches[1]);
	$mime = mime_content_type($file);
	if (is_file($file) && ($handle = fopen($file, 'rb'))) {
		$age = 24 * 3600 * 30;
		header('Expires: '.gmdate('D, d M Y H:i:s', time() + $age).' GMT');
		header('Cache-Control: public, max-age='.$age);
		header('Content-Type: '.$mime);
		header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT');
		while (!feof ($handle)) {
			echo fread($handle, 4096);
		}
		fclose($handle);
	}
 
}
?>

При желании можете загрузить в эту же папку ("uploads") файл "watermark.png", это защитный логотип, который будет добавляться к фалам изображений в правый нижний угол. Файл должен быть именно PNG и иметь именно такое название. Поддерживается прозрачность.

Теперь все картинки будут упаковываться в файл "container.zip" внутри папок с годом и месяцем.

Последние искрение просьбы - не стоит проводить испытания на тяжёлых работающих проектах! Отзывы и пожелания оставляйте в виде комментариев к этой теме.

😃+

5 комментариев on “Упаковщик картинок в WordPress”

1
DAQ

Вау! Прикольно, ё!

04.10.2012 в 00:27
2
Roman

клево. хотелось бы узнать подробнее причину такого шаманства, хостер не позволяет держать маленькие файлы? а что за хостер? тариф?

16.08.2013 в 00:16
3
ptipti

Byet. Вообще у всех абсолютно хостеров всегда скрывается маленькая жопа под словом «безлимит». Ограничяение, как было написано встатье, было именно на иноды. Т.е. максимально можно было хранить 180 тыс. файлов

16.08.2013 в 00:26
4
Roman

а что за хостер и тариф?

16.08.2013 в 09:58
5
Roman

а жопа есть всегда и везде и срывается обычно под звездочкой(ами) 🙂

16.08.2013 в 10:01

Leave a comment

Включите изображения, чтобы увидеть вопрос *