【问题标题】:Magento resize image from Url with same nameMagento从具有相同名称的Url调整图像大小
【发布时间】:2014-07-29 15:40:37
【问题描述】:

我有一个基于Tim Bezhashvyly 帖子的功能,该功能是关于在 Magento 中从 url 调整图像大小。我的问题在于缓存以及当有人更改同名图像时。

示例:我有一个供应商徽标,名称是:mylogo.png。如果我想用不同的徽标更改此徽标但名称相同:mylogo.png 徽标的前端版本不会更改,因为该功能检查是否有 mylogo.png 的缓存版本并且有一个因此它显示旧的。

上传的标志不是我做的,而是供应商做的,我不能阻止他将所有他的标志版本命名为 logo.png。我需要一个聪明的方法来改变缓存系统。每次加载前端页面时都会调用此函数,这就是为什么我需要缓存我不想在每次加载页面时调整大小的图像。

public function resizeImage($path='',$width=100,$height=null,$constrainOnly=true,$keepAspectRatio=true,$keepFrame=true,$keepTransparency=true){
  $Tpath = explode('/',$path);
  $end = end($Tpath); 
  $path = '';
  for ($i=0; $i < count($Tpath)-1 ; $i++) { 
        if($i!=count($Tpath)){
            $path .= $Tpath[$i].'/';
        }else{

        }
  }

  if($end!='')$_file_name = $end;
  else $_file_name = '404.png';

  $_media_dir = Mage::getBaseDir('media') . DS . $path;
  $cache_path = $path . 'cache' . DS . $width.'X'.$height . DS;
  $cache_dir = $_media_dir . 'cache' . DS . $width.'X'.$height . DS;

  if (file_exists($cache_dir . $_file_name)) {
      return Mage::getBaseUrl('media') . $cache_path . $_file_name;
  } elseif (file_exists($_media_dir . $_file_name)) {
      if (!is_dir($cache_dir)) {
          mkdir($cache_dir);
      }

      $_image = new Varien_Image($_media_dir . $_file_name);
      $_image->constrainOnly($constrainOnly);
      $_image->keepAspectRatio($keepAspectRatio);
      $_image->keepFrame($keepFrame);
      $_image->keepTransparency($keepTransparency);
      $_image->resize($width, $height);
      $_image->save($cache_dir . $_file_name);

      return Mage::getBaseUrl('media') . $cache_path . $_file_name;
  }
}

【问题讨论】:

    标签: php magento caching resize


    【解决方案1】:

    您可以尝试不同的方法:在上传新图片时清除该特定图片的缓存。因此,下次您的前端助手尝试输出图像时,将生成一个新的缓存。

    注意:如果您对缓存图像使用相同的 URL,即使上传了新图像,也要考虑处理浏览器缓存,否则,根据原始图像的校验和生成缓存图像的名称。

    编辑:

    一个好的做法是使用实​​体名称生成图像名称,在本例中为品牌名称。

    1. 用描述性和简单的英语为您的图片命名

    在 SEO 方面,使用可接受的关键字来帮助您的网页在搜索引擎上排名很重要。创建描述性、关键字丰富的文件名对于图像优化绝对至关重要。搜索引擎不仅会抓取您网页上的文字,还会在您的图片文件名中搜索关键字。

    来自:shopfiy

    如果清除缓存太麻烦,您可以附加新文件校验和的前 4 个字母:

    <?php 
    
        $fileName = sprintf("%s-%s.%s",
            convert_text_to_friendly_url_function($brandName),
            substr(md5_file($newUploadedFile), 0, 4).
            $fileExtension
        );
    
        // now you have a new fileName, do whatever you need with it.
    ?>
    

    【讨论】:

    • 其实,我想我找到了另一种方式。当上传新图像(后端)时,我用 time() 更改图像的名称,如下所示: $_FILES["logo"]["name"] = time().'_'.$_FILES [“标志”][“名称”];现在,每次我们上传一张带有时间戳的图像,所以即使名称相同,时间戳也不是这也解决了浏览器缓存问题。如果其他人找到更好/不同的方式,请随时分享。
    • 我已经用代码 sn-p 编辑了我的答案。生成的图像名称会比在文件名中包含时间戳更好看。
    • 对您的帖子进行了很好的编辑。我一定会寻找这个解决方案!谢谢
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2011-10-27
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多