使用PHP查找相对路径到图像的绝对路径

3

有类似的问题(PHP:查找输出中相对路径的图像和链接并将它们转换为绝对路径),但我不确定它们是否解决了这个问题。

我正在开发一个jQuery插件,可以安装在任何目录中。它使用的图片也可以安装在任何目录中。图像的路径是在数据属性中设置的,如下所示:

<div id="pr-preview"
    data-img-src="img/example.jpg"
    data-savepath="img/resized/">
</div>

这是通过AJAX函数传递给PHP文件的。在我的PHP文件中,我需要获取图像的尺寸,如下所示:

list($width, $height) = getimagesize($this->data['img']);

但是显然我会收到一个错误:

getimagesize(img/example.jpg): failed to open stream: No such file or directory in ...

PHP文件调整图像大小,并需要将其保存到预定义的保存路径(data-savepath="img/resized/")。在这里我也会遇到同样的问题。

因此,考虑到我不知道这个插件在使用时将安装在哪里,我该如何确保这些路径是正确的?

如果可能,我想避免在数据属性中放置完整的路径。

更新

这是插件文件夹的结构。此文件夹可以安装在public_html的任何位置。而图片目录也可以在任何地方:

public_html/
            img/
               example.jpg
            pluginName/
                  css/
                  js/
                  php/
                     PluginName.php // where getimagesize() is called

你尝试过使用 realpath() 吗? - toesslab
或者最终使用pathinfo()来处理? - toesslab
是的 @Daenu,谢谢。我已经尝试了realpath()但没有成功 - 如果一开始就无法解析路径,我想这不会起作用。 - user3065931
1
如果 img 目录相对于您的 PHP 脚本,则可以定义一个常量 define('IMAGE_PATH', __DIR__.DIRECTORY_SEPARATOR.'img/resized/');。其中,__DIR__ 将返回文件所在的目录,而不是调用脚本。 - frz3993
1
@user3065931,这将取决于你的网站/代码结构。如果PluginName.php是从前端控制器(如index.php)调用的,并且在data-img-src中的路径是相对于前端控制器的,则在$this->data ['img']前面连接“./”将解析文件。没有给出绝对路径,它需要相对于某些东西,对吧? - frz3993
显示剩余2条评论
1个回答

0
也许以下代码能够帮到你。它将从文档根目录开始递归搜索目录,直到找到一个名为 "img" 的目录。然后你可以将返回的路径 ("$imgs") 加在你的图像文件名之前。
<php
define('IMG', 'img');
$docroot = $_SERVER['DOCUMENT_ROOT'];

$imgs = find_img($docroot) . '/';

function find_img($startdir){
    if(basename($startdir) == IMG){
        return realpath($startdir);
    }
    elseif(is_dir($startdir)){
        $results = glob($startdir . '/*', GLOB_ONLYDIR);
        foreach($results as $dir){
            if(basename($dir) == IMG){
                return realpath($dir);
            }
            else{
                return find_img($dir);
            }
        }
        return '';
    }
}
?>

当然,这假定您至少知道图像目录的名称,并且只有一个位置。如果不是这种情况,您将不得不更改代码,例如使其搜索包含 .jpg 的目录,但这将非常不可靠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接