$preffix = $id & 0xf;
$suffix = ($id >> 4) & 0xf;
$post_suffix = ($id >> 8 ) & 0xf;
$dir = "/upload/" . $preffix . "/" . $suffix . "/" . $post_suffix . "/";
хотелось узнать стоит ли такое через RewriteMap закрутитьWMix, зачем считать MD5?
Зачем? Речь идет об распределенном распределении файлов по директориям.хотелось узнать стоит ли такое через RewriteMap закрутить
У нас с вами разные подходы по выводу миниатюр.все правильно, а теперь после того как они раскиданы, хотелось бы их читать, и генерить путь до файла средствами RewriteMap
который кстати может еще и сгенерить/перегенерить preview, зная соурс.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(upload/[a-zA-z0-9\/]+?)([0-9]+)x([0-9]+)/([A-Za-z0-9_\\-]+\.(?:jpe?g|jpeg|png|gif))$ \
thumbs.php?basedir=$1&width=$2&height=$3&image=$4 \
[L,QSA,NC]
<?php
define("DEFAULT_UMASK", 0002);
error_reporting(E_ALL);
ini_set("display_errors", "on");
$basedir = isset($_REQUEST['basedir']) ? $_REQUEST['basedir'] : null;
$width = isset($_REQUEST['width']) ? abs($_REQUEST['width']) : null;
$height = isset($_REQUEST['height']) ? abs($_REQUEST['height']) : null;
$image = isset($_REQUEST['image']) ? basename($_REQUEST['image']) : null;
if (
!$basedir || (!$width && !$height) || !$image
|| !preg_match("/^upload\\/[a-z0-9\\/]+$/i", $basedir)
|| !preg_match("/^[a-z0-9\\-\\_\\/]+\\.(?:jpe?g|png|gif)$/i", $image)
|| !file_exists($basedir)
|| !file_exists($src = ($basedir.$image))
|| !file_exists($dst = ($basedir.$width."x".$height."/"))
|| !is_dir($dst)
) {
header("HTTP/1.1 404 Not found", true, 404);
echo "<html><head><title></title></head><body><h1>Image not found</h1>";
echo "<p>Click here: <a href=\"/\">/</a></p></body></html>";
exit();
}
if (
!is_readable($src)
|| !is_writable($dst)
) {
header("HTTP/1.1 403 Forbidden", true, 403);
echo "<html><head><title></title></head><body><h1>Permission denided</h1>";
echo "<p>Click here: <a href=\"/\">/</a></p></body></html>";
exit();
}
if (file_exists($path = ($dst.$image))) {
if (is_readable($path) && is_file($path)) {
header("Content-type: ".mime_content_type($path));
exit(readfile($path));
} else {
unlink($path);
}
}
require_once('app/images/resizer.php');
$resizer = new app_images_resizer();
try {
if (
isset($_GET['crop']) && $_GET['crop']
and
isset($_GET['kx1']) && preg_match("/^[0-9]+\\.[0-9]+$/", $_GET['kx1'])
and
isset($_GET['ky1']) && preg_match("/^[0-9]+\\.[0-9]+$/", $_GET['ky1'])
and
isset($_GET['kx2']) && preg_match("/^[0-9]+\\.[0-9]+$/", $_GET['kx2'])
and
isset($_GET['ky2']) && preg_match("/^[0-9]+\\.[0-9]+$/", $_GET['ky2'])
and
isset($_GET['ratio']) && preg_match("/^[0-9]+\\:[0-9]+$/", $_GET['ratio'])
)
{
if (!($imageInfo = getimagesize($src)))
{
throw new Exception("Изображение не допустимого формата #1");
}
if (!$imageInfo[0] || !$imageInfo[1])
{
throw new Exception("Изображение не допустимого формата #2");
}
list($scale_x, $scale_y) = explode(":", $_GET['ratio']);
/* $k = min($scale_x/$scale_y, $scale_y/$scale_x);
if (($kz = min($imageInfo[0] / $width, $imageInfo[1] / $height)) > 1)
{
$kz = 1;
}
if ($k == ($scale_y/$scale_x))
{
$width = intval($width * $kz);
$height = intval($height * $k * $kz);
}
else
{
$width = intval($width * $k * $kz );
$height = intval($height * $kz );
}*/
$resizer
->setNoChangeExt(true)
->setCrop(true)
->setKx1($_GET['kx1'])
->setKy1($_GET['ky1'])
->setKx2($_GET['kx2'])
->setKy2($_GET['ky2'])
->setSrc($src)
->setDst($path)
->setMaxWidth($width)
->setMaxHeight($height)
->setName($image)
->resize();
;
}
else
{
$resizer
->setNoChangeExt(true)
->setSrc($src)
->setDst($path)
->setMaxWidth($width)
->setMaxHeight($height)
->setName($image)
->resize();
}
if (file_exists($path) && is_readable($path)) {
header("Content-type: ".mime_content_type($path));
exit(readfile($path));
}
} catch(Exception $e) {
header("HTTP/1.1 500 Internal server error", true, 500);
echo "<html><head><title></title></head><body><h1>Resize image failed</h1>";
echo "<p>{$e->getMessage()}</p>";
echo "<p>Click here: <a href=\"/\">/</a></p></body></html>";
exit();
}
Ну влюбом случае это хранится в СУБД, и hostname сервера на котором хранится это изображение хранится в СУБД. В случае распределенной системы хранения считать ничего не стоит, не так ли?сервер изображений может возвращать ID изображения в формате 'path/xyz' после того как на него залили это изображение,
это решает проблему как узнать путь к файлу изображений,
а как сгенерировать значение path - не представляется важным
Я за год, что был в творческом порыве и возможно что-то пропустил. Что есть "кодеры поколения Y" ?))
если словом "это" ты называешь id изображения - да, путь к картинке всегда лежит в базе приложения,Ну влюбом случае это хранится в СУБД, и hostname сервера на котором хранится это изображение хранится в СУБД. В случае распределенной системы хранения считать ничего не стоит, не так ли?
Полностью согласен. Под "это" я называю информацию))если словом "это" ты называешь id изображения - да, путь к картинке всегда лежит в базе приложения,
на сервере изхображения картинки просто лежат в каталогах, и никой базы не нужно,
считать требуется только в момент загрузки файла изображения на CDN-сервер
В качестве сообщения, не в тему, но все же )) Иван Сергеевич Тургенев со своим произведением всех времен будет актуален вечно))Активист, https://ru.wikipedia.org/wiki/Поколение_Y
хотя, это тоже очень нетематическое личное сообщение, которое надо бы вычистить )))
да, "Муму" бессмертноИван Сергеевич Тургенев со своим произведением всех времен будет актуален вечно))
Если бы вы обратили внимание, то заметили бы, что в RewriteCond стоит условие "-f". Данный алгоритм является избыточным, и при условии что mod_rewrite существует, то повторный вызов thumbs.php никогда не будет вызван. Но, поскольку я, как программист должен предусмотреть все возможные варианты развития событий (в том числе ХАК, в виде прямого вызова скрипта) - то простой readfile избавит сервер от вторичного ресайза изображения, чем не будет использовать ресурсы GD для бесполезного крайне ресурсоемного действия, остановив возможный dDoS. Поэтому Ваша ремарка является крайне неуместной, мягко говоря. Но спасибо на том, что Вы заострили внимание на столь важном участке кода, который возможно, позволит читателям расширить свои знания и не допускать алгоритмических ошибок в будущем в своих проектах.Активист, трудно сказать кто больше жалеет сервер