检查字符串以查看文件是否存在于本地

时间:2012-05-11 21:17:19

标签: php

如果可以,我有一个问题。我有一个名为$source的变量,此应该包含文件的相对路径,例如./uploads/2012/some-document.pdf

现在,这个$source变量将包含用户输入,通过$ _GET和$ _POST。我不希望人们输入网址,如果该文件在本地服务器上仅存在 ,我只想做某事。

我的问题是检查本地服务器上是否存在文件的最佳方法是什么?


这是我到目前为止所得到的:

1)file_exists可能会返回true,具体取决于服务器配置,因此我可以将其与stripos一起使用来检查字符串的前几个charatcers是否为http://如此:

if( file_exists($source) && stripos($source,'http://')!==0 ) {
    echo 'File exists on local';
}

然而,缺点是我必须指定所有不同的URL类型,例如https://,http://和ftp://只是为了安全。

2)我使用realpath来获取文件的绝对路径,如果找不到,则返回false。这看起来非常可靠,但不是100%这是它的最佳应用

3)首先使用preg_replace删除字符串中的所有网址提及,然后只使用file_exists。虽然这可能是最安全的,但它很可能是最密集的,我宁愿不使用这种方法。

2 个答案:

答案 0 :(得分:4)

除了其他答案之外,您可以简单地拒绝使用方案的路径:

if (parse_url($path, PHP_URL_SCHEME)) {
    // has something:// so ignore
}

这也适用于php://zlib://等特色包装......

您还可以通过添加file://

来强制对输入变量进行本地检查
file_exists('file://' . $path);

答案 1 :(得分:2)

使用realpath()(与file_exists一起使用)。它将为您过滤掉URL,您应该获得关于文件是否存在的可靠结果。