图像的文件系统路径
File system path for images
我正在编写一个扩展 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 图片 URL(采用 \HtmlHelper::image()
接受的任何格式)转换为文件系统路径(o 类似于 null
时不适用)但我找不到任何东西。需要磁盘路径的本机功能,例如 \Helper::assetTimestamp()
包含在大量不可重用的代码中。
有没有优雅的解决方案?
尝试使用 DS 而不是使用 \ 或 /,它们有时会导致 OS 出现问题。
DS是cakephp提供的目录分隔符PHP的DIRECTORY_SEPARATOR的缩写,在Linux上是/,在Windows上是\。
Check the doc
我会说几乎只有 3 个选项:
- 提交补丁以将资产文件系统路径检索功能添加到核心。
- 从帮助程序(
assetUrl()
、webroot()
和 assetTimestamp()
)复制大量代码。
- 对本地 URL 使用 Web 请求(最好结合缓存)。
我正在编写一个扩展 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 图片 URL(采用 \HtmlHelper::image()
接受的任何格式)转换为文件系统路径(o 类似于 null
时不适用)但我找不到任何东西。需要磁盘路径的本机功能,例如 \Helper::assetTimestamp()
包含在大量不可重用的代码中。
有没有优雅的解决方案?
尝试使用 DS 而不是使用 \ 或 /,它们有时会导致 OS 出现问题。 DS是cakephp提供的目录分隔符PHP的DIRECTORY_SEPARATOR的缩写,在Linux上是/,在Windows上是\。 Check the doc
我会说几乎只有 3 个选项:
- 提交补丁以将资产文件系统路径检索功能添加到核心。
- 从帮助程序(
assetUrl()
、webroot()
和assetTimestamp()
)复制大量代码。 - 对本地 URL 使用 Web 请求(最好结合缓存)。