图像的文件系统路径

时间:2017-06-07 09:22:00

标签: cakephp cakephp-2.9

我正在编写一个自定义帮助程序,它扩展HtmlHelper并覆盖\HtmlHelper::image()方法来计算图像尺寸并将它们添加为HTML属性。到目前为止我的常规照片效果很好:

public function image($path, $options = array()) {
    if (!array_key_exists('width', $options) && !array_key_exists('height', $options)) {
        $stamp = Configure::read('Asset.timestamp');
        Configure::write('Asset.timestamp', false);

        $path = $this->assetUrl($path, $options + array('pathPrefix' => Configure::read('App.imageBaseUrl')));
        list($width, $height) = @getimagesize(rtrim(WWW_ROOT, '\\/') . $path);
        if (!is_null($width)) {
            $options['width'] = $width;
        }
        if (!is_null($height)) {
            $options['height'] = $height;
        }

        Configure::write('Asset.timestamp', $stamp);
    }
    return parent::image($path, $options);
}

......但有这些缺陷:

  • 来自插件的图片不能位于磁盘上(他们应该),例如:

    echo $this->Html->image('/debug_kit/img/cake.icon.png', array('alt' => 'CakePHP'));
    

    ...生成此文件系统路径:

    …\src\webroot/debug_kit/img/cake.icon.png
    

    ...因此getimagesize()失败,因为实际位置为:

    …\src\Plugin\DebugKit\webroot\img\cake.icon.png"
    
  • 外部图片(应该被忽略)完成整个过程:

    echo $this->Html->image('http://placekitten.com/200/300');
    …\src\webroothttp://placekitten.com/200/300
    

我一直在寻找一种内置方法,将CakePHP图片网址(以\HtmlHelper::image()接受的任何格式转换为文件系统路径(如果不适用,则为null),但是我找不到任何东西。需要磁盘路径的本机功能,例如\Helper::assetTimestamp(),包含在大量不可重复使用的代码中。

有优雅的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我会说只有3个选项:

  • 提交补丁以将资产文件系统路径检索功能添加到核心。
  • 从帮助程序(assetUrl()webroot()assetTimestamp())复制大量代码。
  • 对本地URL使用Web请求(理想情况下与缓存相结合)。

答案 1 :(得分:0)

尝试使用DS而不是使用\或/,它们有时会导致操作系统出现问题。 DS是cakephp提供的目录分隔符,用于PHP的DIRECTORY_SEPARATOR,它位于Linux上,位于Windows上,位于Windows上。 Check the doc