如果可以,我有一个问题。我有一个名为$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
。虽然这可能是最安全的,但它很可能是最密集的,我宁愿不使用这种方法。
答案 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,您应该获得关于文件是否存在的可靠结果。