Obter arquivo de imagem original de um URL de cache


33

Existe alguma função que, devido a um arquivo de produto de imagem em cache, retorne o original?

Exemplo:

=> URL do cache:

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

=> Resultado desejado:

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

Respostas:


74

O URL da imagem que você forneceu é impossível de ter com uma loja Magento. Suponho que você queria que isso fosse ofuscado, mas, ao fazer isso, tornou impossível responder.

Não consigo pensar em nenhum motivo para desconstruir o caminho da imagem, a menos que você esteja raspando na Web outro site, caso contrário, você teria acesso direto ao modelo do produto e poderia buscar essas informações diretamente.

No entanto, usando um exemplo real. Por exemplo

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

De construir o caminho da imagem em cache

/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

Localizando a imagem original

Se enviado via administrador Magento , a imagem original está localizada em,

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

Portanto, é muito fácil obter o URL original, basta remover o caminho e o hash do diretório de cache.

Ou seja. Removercache/1/image/9df78eab33525d08d6e5fb8d27136e95/

tão

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

Torna-se

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

Se carregada via fluxo de dados / importação , a imagem original está localizada em

/ media / import

Mas além, haveria suposições. No entanto, as pessoas desejam formatar seu DIR de upload para importação é realmente deles e o subdiretório em que as imagens realmente não é relevante - pois eles fornecem o caminho relativo para a imagem durante o upload.

Um pouco sobre o md5 Hash

($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,

Args opcionais se houver uma marca d'água

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

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

Por exemplo, com os padrões

md5('non_no_no_not_ffffff_0_90')

O md5hash pode ser o mesmo em todo o site - para cada imagem, mas você precisa descobrir os valores usados ​​para gerá-lo. Você pode fazer força bruta com relativa facilidade.

Este é o valor padrão do Magento para o hash

9df78eab33525d08d6e5fb8d27136e95

Atribuições: sonassi.com


3
Claro que você tem uma resposta extremamente exaustiva com a arte ascii ... :)
— philwinkle

6
LOL - Eu estava esperando alguém comentar sobre a arte ASCII :) Vale a pena levar 10 minutos para desenhar / digitar! Claramente, não estamos publicando a resposta da documentação do Magento-1 por resposta.
— Ben Lessani - Sonassi

1
sonassi, não faço ideia de onde vem o seu tempo, mas você é uma grande vitória para a comunidade e para todos nós!
— Fabian Blechschmidt

Isso foi muito útil para mim e uma das melhores respostas que já li. Obrigado!
— precisa saber é o seguinte

8

Resposta curta - não. Não há método para retornar a imagem base com base no URL da imagem em cache. No entanto, se você remover a pasta do cache e o hash, poderá intuir qual seria o URL, por exemplo:

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

remova tudo o que estiver após o produto até o prefixo (neste caso, remova cache/1/image/109x298/9df78eab33525d08d6e5fb8d27136e95/:

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

Talvez uma maneira melhor de lidar com isso, no entanto, seja usar o modelo de objeto:

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

5

Isso funciona

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

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

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

provavelmente não é a melhor abordagem, mas funciona bem. por que voto negativo?
— Fra

Isso não produzirá resultados inconsistentes se houver dimensões de imagem no nome do arquivo, pois isso compensaria os índices?
— Eric Seastrand

4

No list.phtml, é isso que funcionou para mim:

echo Mage::getModel('catalog/product_media_config')->getMediaUrl( $_product->getSmallImage()); 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.