Получить оригинальный файл изображения из URL-адреса кэша


33

Есть ли какая-либо функция, которая при условии, что файл продукта с изображением кэша возвращает исходную?

Пример :

=> Кэш URL:

{BASEURL}/media/catalog/product/cache/2/image/9df78eab33525d08d6e5fb8d27136e95/a/l/IMAGE.jpg

=> Желаемый результат:

BASEURL/media/catalog/product/a/l/IMAGE.jpg

Ответы:


74

URL изображения, который вы дали, невозможно получить в магазине Magento. Я предполагаю, что вы хотели, чтобы это было запутано, но при этом сделали невозможным ответить.

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

Тем не менее, используя реальный пример. Например

/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/m/e/me-d1_2.jpg

Де построение пути кеш-образа

/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/m/e/me-d1_2.jpg
|___________________________|_|_____|________________________________|_|_|__________|
             |               |   |                  |                 | |     |
       Cache Directory       |   |                  |                 | |     |
Mage/Catalog/Model/Product/Media/Config.php         |                 | |     |
getBaseMediaPath()           |   |                  |                 | |     |
                             |   |                  |                 | |     |
                             |   |                  |                 | |     |
                          Store ID                  |                 | |     |
                          Mage::app()->getStore()->getId()            | |     |
                                 |                  |                 | |     |
                                 |                  |                 | |     |
                            Subdirectory            |                 | |     |
                            Mage/Catalog/Model/Product/Image.php      | |     |
                            getDestinationSubdir()  |                 | |     |
                                                    |                 | |     |
                                                    |                 | |     |
                                              MD5 of Image Params     | |     |
                                              See below               | |     |
                                              Mage/Catalog/Model/Product/Image.php
                                              Line +324               | |     |
                                                                      | |     |
                                                                      | |     |
                                                          First letter of Image Name
                                                                        |     |
                                                                        |     |
                                                          Second letter of Image Name
                                                                              |
                                                                              |
                                                                     Original Image Name

Нахождение исходного изображения

При загрузке через администратора Magento исходное изображение находится по адресу:

/media/catalog/product/m/e/me-d1_2.jpg

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

То есть. удалятьcache/1/image/9df78eab33525d08d6e5fb8d27136e95/

Так

/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/m/e/me-d1_2.jpg

становится

/media/catalog/product/m/e/me-d1_2.jpg

При загрузке через поток данных / импорт исходное изображение находится в

/ СМИ / импорт

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

Немного о хеше md5

($this->_keepAspectRatio  ? '' : 'non') . 'proportional',
($this->_keepFrame        ? '' : 'no')  . 'frame',
($this->_keepTransparency ? '' : 'no')  . 'transparency',
($this->_constrainOnly ? 'do' : 'not')  . 'constrainonly',
$this->_rgbToString($this->_backgroundColor),
'angle' . $this->_angle,
'quality' . $this->_quality,

Необязательные аргументы, если есть водяной знак

$this->getWatermarkFile(),
$this->getWatermarkImageOpacity(),
$this->getWatermarkPosition(),
$this->getWatermarkWidth(),
$this->getWatermarkHeigth()

md5(implode('_', $miscParams));

Так, например, со значениями по умолчанию

md5('non_no_no_not_ffffff_0_90')

md5Хэш может быть одинаковым по всему сайту - для каждого изображения, но вам нужно будет выяснить значения , используемые для его генерации. Вы можете сделать это сравнительно легко.

Это значение Magento по умолчанию для хэша

9df78eab33525d08d6e5fb8d27136e95

Атрибуты: sonassi.com


3
Конечно, у вас есть невероятно исчерпывающий ответ с ascii art ... :)
philwinkle

6
LOL - Я ждал, что кто-то прокомментирует искусство ASCII :). Стоит того, чтобы рисование / печатание заняло 10 минут! Очевидно, что мы неофициально публикуем ответ по документации Magento-1 за ответом.
Бен Лессани - Сонасси

1
sonassi, я понятия не имею, откуда пришло ваше время, но вы большая победа для сообщества и всех нас!
Фабиан Блехшмидт

Это было очень полезно для меня, и один из лучших ответов, которые я когда-либо читал. Благодарность!
LeCodeur

8

Краткий ответ - нет. Нет способа вернуть базовое изображение на основе URL-адреса изображения кэша. Однако, если вы удалите папку кеша и хеш, вы сможете понять, каким будет URL, например:

 http://www.mysite.com/media/catalog/product/cache/1/image/109x298/9df78eab33525d08d6e5fb8d27136e95/u/t/uti001_2.jpg

удалить все после продукта до префикса trie (в этом случае удалить cache/1/image/109x298/9df78eab33525d08d6e5fb8d27136e95/:

 http://www.mysite.com/media/catalog/product/u/t/uti001_2.jpg

Возможно, лучший способ справиться с этим - использовать объектную модель:

$product = Mage::getModel('catalog/product')->load(42);
echo $product->getImage();
echo $product->getThumbnail();

5

Это работает

   $r = explode('/' ,$imagesCachePath);

   unset($r[6]);
   unset($r[7]);
   unset($r[8]);
   unset($r[9]);

   $r = implode('/',$r);

это не самый лучший подход, но работает нормально. почему понизить?
От

Не приведет ли это к противоречивым результатам, если в имени файла есть размеры изображения, поскольку это сместит индексы?
Эрик Сеастранд,

4

В list.phtml, это то, что работает для меня:

echo Mage::getModel('catalog/product_media_config')->getMediaUrl( $_product->getSmallImage()); 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.