Obtener el archivo de imagen original de una URL de caché

33

¿Hay alguna función que, dado un archivo de producto de imagen de caché, devuelva el original?

Ejemplo:

=> URL de caché:

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

=> Resultado deseado:

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

Respuestas:

74

Es imposible tener la URL de la imagen que ha proporcionado con una tienda Magento. Supongo que querías que se ofuscara, pero al hacerlo, ha sido imposible responder.

No puedo pensar en ninguna razón para desarmar la ruta de la imagen a menos que esté raspando en la web otro sitio web, de lo contrario, tendría acceso directo al modelo del producto y podría obtener esta información directamente.

Sin embargo, usando un ejemplo real. P.ej

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

De construir la ruta de la imagen de caché

/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

Ubicando la imagen original

Si se carga a través del administrador de Magento , la imagen original se encuentra en,

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

Entonces, obtener la URL original es bastante fácil, simplemente elimine la ruta del directorio de caché y el hash.

Es decir. retirarcache/1/image/9df78eab33525d08d6e5fb8d27136e95/

Asi que

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

Se convierte

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

Si se carga a través del flujo de datos / importación , la imagen original se encuentra en

/ media / import

Pero más allá habría conjeturas. Sin embargo, la gente quiere formatear su DIR de carga para importar realmente depende de ellos y el subdirectorio en el que se encuentran las imágenes realmente no es relevante, ya que proporcionan la ruta relativa a la imagen al cargar.

Un poco sobre el hash 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,

Args opcionales si hay una marca de agua

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

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

Entonces, por ejemplo, con los valores predeterminados

md5('non_no_no_not_ffffff_0_90')

El md5hash podría ser el mismo en todo el sitio, para cada imagen, pero necesitaría averiguar los valores utilizados para generarlo. Podrías forzarlo con relativa facilidad.

Este es el valor predeterminado de Magento para el hash

9df78eab33525d08d6e5fb8d27136e95

Atribuciones: sonassi.com

Ben Lessani - Sonassi
fuente
3
Por supuesto, tiene una respuesta increíblemente exhaustiva con ascii art ... :)
philwinkle
66
LOL - Estaba esperando que alguien comentara sobre el arte ASCII :) Hace que valga la pena que tomó 10 minutos dibujar / escribir. Claramente, estamos publicando extraoficialmente la documentación de Magento-1 respuesta por respuesta.
Ben Lessani - Sonassi
1
sonassi, no tengo idea de dónde viene tu tiempo, ¡pero eres una gran victoria para la comunidad y para todos nosotros!
Fabian Blechschmidt
Eso fue muy útil para mí, y una de las mejores respuestas que he leído. ¡Gracias!
LeCodeur
8

Respuesta corta: no. No hay ningún método para devolver la imagen base según la url de la imagen de caché. Sin embargo, si elimina la carpeta de caché y el hash, debería poder intuir cuál sería la URL, por ejemplo:

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

elimine todo después del producto hasta el prefijo trie (en este caso, elimine cache/1/image/109x298/9df78eab33525d08d6e5fb8d27136e95/:

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

Sin embargo, quizás una mejor manera de lidiar con esto es usar el modelo de objetos:

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

Esto funciona

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

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

   $r = implode('/',$r);
Fra
fuente
probablemente no sea el mejor enfoque, pero funciona bien. ¿Por qué rechazar?
Fra
¿No producirá resultados inconsistentes si hay dimensiones de imagen en el nombre de archivo, ya que esto compensaría los índices?
Eric Seastrand
4

En el list.phtml, esto es lo que funcionó para mí:

echo Mage::getModel('catalog/product_media_config')->getMediaUrl( $_product->getSmallImage()); 
wpguy
fuente