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.