从缓存URL获取原始图像文件


33

给定缓存映像产品文件的功能是否有返回原始文件的功能?

范例:

=>缓存网址:

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

=>所需结果:

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

Answers:


74

Magento商店无法提供您提供的图像URL。我猜您希望对其进行混淆,但是这样做无法回答。

除非您要通过网络抓取另一个网站,否则我认为没有任何理由可以解构图像路径,否则,您将可以直接访问产品模型并可以直接获取此信息。

不过,使用一个真实的例子。例如

/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

如果通过数据流/导入上传,则原始图像位于

/ media / import

但除此之外,还会有猜测。但是,人们想格式化要上传的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艺术有一个非常详尽的答案... :)
philwinkle

6
大声笑-我在等待有人对ASCII艺术发表评论:)值得一提的是,它花了10分钟才能绘制/输入!显然,我们正在非正式地逐答案发布Magento-1文档。
Ben Lessani-Sonassi

1
索纳西,我不知道您的时间从何而来,但是对于社区和我们所有人来说,您都是一个巨大的胜利!
Fabian Blechschmidt

这对我非常有用,也是我读过的最好的答案之一。谢谢!
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);

这可能不是最好的方法,但是效果很好。为什么要投票?
2013年

如果文件名中有图像尺寸,这会不会产生不一致的结果,因为这会偏移索引?
埃里克·海斯特兰德

4

在中list.phtml,这对我有用:

echo Mage::getModel('catalog/product_media_config')->getMediaUrl( $_product->getSmallImage()); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.