从PHP streamwrapper获取文件系统路径?

时间:2015-06-22 16:24:15

标签: php

如果我在php streamwrapper中有一个文件,例如"media://icon.png"我怎么能让它告诉我该文件的文件系统路径,假设它在文件系统上?

我查看documentation page,但没有看到返回streamwrapper路径的方法。

1 个答案:

答案 0 :(得分:1)

StreamWrapper类表示通用流。因为并非所有流都受文件系统概念的支持,所以没有通用的方法。

If the uri property from stream_get_meta_data isn't working for your implementation,您可以在营业时间记录信息,然后通过stream_get_meta_data访问。例如:

class MediaStream {
    public $localpath = null;

    public function stream_open($path, $mode, $options, &$opened_path)
    {
        $this->localpath = realpath(preg_replace('+^media://+', '/', $path));

        return fopen($this->localpath, $mode, $options);
    }
}

stream_wrapper_register('media', 'MediaStream');

$fp   = fopen('media://tmp/icon.png', 'r');
$data = stream_get_meta_data($fp);
var_dump(
    $data['wrapper_data']->localpath
);

当然,总有一种蛮力方法:创建资源后,您可以调用fstat,其中包括设备和inode。然后,您可以打开该设备,遍历其目录结构,并找到该inode。 See here for an example.