Раскидать картинки по папкам.

Активист

Активист
Команда форума
Нет, это абсолютно разные операции. Или остаток от деления или битовые операнды!?
 

Активист

Активист
Команда форума
WMix, зачем считать MD5? Зачем ?? Зачем все это??? Пожалейте сервер.

PHP:
$dir = "/upload/" . ($id & 0xffff) . "/" . ($id & 0xff) . "/";
 
Последнее редактирование:

Активист

Активист
Команда форума
В битовых операциях идет возрастание справа налево, так юзайте простой побитовый and.
 
Последнее редактирование:

Активист

Активист
Команда форума
Ну вот вы предложили какой-то сраный MD5 считать. Посмотрите алгоритм MD5 и сравните с этим:
PHP:
$preffix = $id & 0xf;
$suffix = ($id >> 4) & 0xf;
$post_suffix = ($id >> 8 ) & 0xf;

$dir = "/upload/" . $preffix . "/" . $suffix . "/" . $post_suffix . "/";
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
все правильно, а теперь после того как они раскиданы, хотелось бы их читать, и генерить путь до файла средствами RewriteMap
который кстати может еще и сгенерить/перегенерить preview, зная соурс.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
сервер изображений может возвращать ID изображения в формате 'path/xyz' после того как на него залили это изображение,
это решает проблему как узнать путь к файлу изображений,
а как сгенерировать значение path - не представляется важным
 
Последнее редактирование:

Активист

Активист
Команда форума
все правильно, а теперь после того как они раскиданы, хотелось бы их читать, и генерить путь до файла средствами RewriteMap
который кстати может еще и сгенерить/перегенерить preview, зная соурс.
У нас с вами разные подходы по выводу миниатюр.

Методом ниже решается масса проблем и с легкостью может быть адаптировано под любые HTTP сервера - "Генерь - не хочу".

Код:
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:
<?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();
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак, давай я буду чистить твои очень нетематические личные сообщения, которые ты можешь писать в личку?

Активист, кодеры поколения Y не изучают битовые операции, они берут фреймворк и пишут все на готовых библиотеках
 
Последнее редактирование:

Активист

Активист
Команда форума
сервер изображений может возвращать ID изображения в формате 'path/xyz' после того как на него залили это изображение,
это решает проблему как узнать путь к файлу изображений,
а как сгенерировать значение path - не представляется важным
Ну влюбом случае это хранится в СУБД, и hostname сервера на котором хранится это изображение хранится в СУБД. В случае распределенной системы хранения считать ничего не стоит, не так ли?
 

Активист

Активист
Команда форума
Вурдалак, давай я буду чистить твои очень нетематические личные сообщения, которые ты можешь писать в личку?

Активист, кодеры поколения Y не изучают битовые операции, они берут фреймворк и пишут все на готовых библиотеках
Я за год, что был в творческом порыве и возможно что-то пропустил. Что есть "кодеры поколения Y" ?))
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ну влюбом случае это хранится в СУБД, и hostname сервера на котором хранится это изображение хранится в СУБД. В случае распределенной системы хранения считать ничего не стоит, не так ли?
если словом "это" ты называешь id изображения - да, путь к картинке всегда лежит в базе приложения,
на сервере изхображения картинки просто лежат в каталогах, и никой базы не нужно,
считать требуется только в момент загрузки файла изображения на CDN-сервер
 

Активист

Активист
Команда форума
если словом "это" ты называешь id изображения - да, путь к картинке всегда лежит в базе приложения,
на сервере изхображения картинки просто лежат в каталогах, и никой базы не нужно,
считать требуется только в момент загрузки файла изображения на CDN-сервер
Полностью согласен. Под "это" я называю информацию))
 

Активист

Активист
Команда форума
Активист, https://ru.wikipedia.org/wiki/Поколение_Y
хотя, это тоже очень нетематическое личное сообщение, которое надо бы вычистить )))
В качестве сообщения, не в тему, но все же )) Иван Сергеевич Тургенев со своим произведением всех времен будет актуален вечно))
 

Активист

Активист
Команда форума
Активист, трудно сказать кто больше жалеет сервер
Если бы вы обратили внимание, то заметили бы, что в RewriteCond стоит условие "-f". Данный алгоритм является избыточным, и при условии что mod_rewrite существует, то повторный вызов thumbs.php никогда не будет вызван. Но, поскольку я, как программист должен предусмотреть все возможные варианты развития событий (в том числе ХАК, в виде прямого вызова скрипта) - то простой readfile избавит сервер от вторичного ресайза изображения, чем не будет использовать ресурсы GD для бесполезного крайне ресурсоемного действия, остановив возможный dDoS. Поэтому Ваша ремарка является крайне неуместной, мягко говоря. Но спасибо на том, что Вы заострили внимание на столь важном участке кода, который возможно, позволит читателям расширить свои знания и не допускать алгоритмических ошибок в будущем в своих проектах.
 
Последнее редактирование:
Сверху