Я обновил упаковщик, теперь поддерживаются маймы (вызывало проблемы в некоторых браузерах и в флеш-проигрывателях) , теперь проверка файла на добавление в архиве более весомая и теперь файлы не должны исчезать как раньше. Упаковщик достаточно быстрый нормально работает даже с большими файлами, пример: http://ptipti.ru/природа/ тяжёлое видео.
Случилось так, что подлый хостер, обещающий безлимитное дисковое пространство, забыл уточнить, что неограничен объём, а вот количество файлов… Собственно с этим срочно надо было что-то делать. Благо есть WordPress, в котором очень в этом плане грамотно сделана структура загрузок и вообще все операции с картинками.
Вот и пришла в голову мысль, хранить все картинки в типа контейнерах. То есть в архиве и по требованию на лету их извлекать. Если вас это заинтересовало, с удовольствием был бы рад увидеть комментарии, отзывы и предложения.
ПРЕДУПРЕЖДАЮ ЗАРАНЕЕ — ТО ЧТО ВЫ СДЕЛАЕТЕ, ЭТО БУДЕТ СДЕЛАНО С ПОЛНОЙ ВАШЕЙ ОТВЕТСТВЕННОСТЬЮ И ПОНИМАНИЕМ, ЧТО АВТОР НЕ НЕСЁТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ПОРЧУ/УТРАТУ/ЧАСТИЧНУЮ УТРАТУ ИНФОРМАЦИИ.
Если вы решились установить дополнение, ПОЖАЛУЙСТА сделайте резервную копию всей папки «uploads» вашего WordPress и сохраните в укромное место.
На данный момент дополнение имеет состояние «Альфа» и устанавливается вручную. В последующем планируется сделать дополнение в виде плагина, но это всё потом.
И так, вы сделали бекап папки «uploads» (как я просил ранее), сохранили его в укромное место. Точно сделали и точно сохранили. Чтоб потом не было слюней, соплей и проклятий в мой адрес. Теперь точно сделали? Тогда читаем дальше.
Создадим файл «.htaccess» в папке «uploads», впишем туда такие строки:
RewriteEngine On
RewriteRule .* index.php [L]
(Если вы используете веб-сервер, отличный от Apache, уточните как правильно написать рерайты для конкретной ситуации)
Рядом с ним (в папке «uploads») создадим файл «index.php» с таким содержимым:
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» внутри папок с годом и месяцем.
Последние искрение просьбы — не стоит проводить испытания на тяжёлых работающих проектах! Отзывы и пожелания оставляйте в виде комментариев к этой теме.