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
Fra
fonte

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

Ben Lessani - Sonassi
fonte
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();
philwinkle
fonte
5

Isso funciona

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

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

   $r = implode('/',$r);
Fra
fonte
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()); 
wpguy
fonte