キャッシュURLから元の画像ファイルを取得する


33

キャッシュイメージ製品ファイルに元のファイルを返す関数はありますか?

例:

=>キャッシュURL:

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

=>望ましい結果:

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

回答:


74

指定した画像URLは、Magentoストアでは使用できません。あなたはそれを難読化することを望んでいたと思いますが、そうすることで答えることが不可能になりました。

別のWebサイトをWebスクレイピングしている場合を除き、画像パスを分解する理由は考えられません。

それにもかかわらず、実際の例を使用します。例えば

/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

dataflow / importを介してアップロードされた場合、元の画像は

/ 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
もちろん、あなたはアスキーアートで非常に徹底的な答えを持っています... :)
philwinkle

6
LOL-私は誰かがASCIIアートについてコメントするのを待っていました:)描画/入力に10分かかったことは価値があります!明らかに、非公式にMagento-1のドキュメントを回答ごとに投稿しています。
ベン・レッサーニ-ソナシ

1
ソナシ、あなたの時間はどこから来たのかわかりませんが、あなたはコミュニティと私たち全員にとって大きな勝利です!
ファビアンブレヒシュミット

それは私にとって非常に有用であり、私が今まで読んだ中で最高の答えの一つです。ありがとう!
LeCodeur

8

短い答え-いいえ。キャッシュイメージのURLに基​​づいてベースイメージを返す方法はありません。ただし、キャッシュフォルダーとハッシュを削除すると、URLが何であるかを直観できるはずです。例:

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

プレフィックストライまで製品の後のすべてを削除します(この場合、削除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);

おそらく最良のアプローチではありませんが、うまく機能します。なぜ投票するのですか?
Fra

ファイル名に画像の寸法が含まれていると、インデックスがオフセットされるため、一貫性のない結果になりませんか?
エリックイーストランド

4

list.phtml、これは私のために働いたものです:

echo Mage::getModel('catalog/product_media_config')->getMediaUrl( $_product->getSmallImage()); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.