当所有其他元素看起来正确时,为什么调用fopen会失败?

时间:2014-12-28 21:03:18

标签: php fopen

是的,关于fopen()的另一个问题......有数百个,但没有一个得到这个。 This question非常相似,但在尝试答案后(检查权限,检查树是否存在),我仍然遇到此问题。

当尝试使用fopen创建文件时,我调用该函数并为其提供所需的参数,但它会发出警告:"没有这样的文件或目录"。但是,检查树会显示目录确实存在。代码如下:

$target_dir = "/files/" . usernameIs() . "/";
$target_file = $target_dir . basename($_FILES["uploadedFile"]["name"]);

...

$file = fopen($target_file, "w+");
fclose($file);

$target_file最终包含/files/ArtOfCode/icon.png(用户名为ArtOfCode,name的{​​{1}}我用来测试的是icon.png。< / p>

目录树如下所示:

uploadedFile

我收到两条警告,都与public_html > /upload > /upload.php (the calling script) > /action.php (this script) > /files > /ArtOfCode

有关
fopen()

所以,我知道文件(/files/ArtOfCode/icon.png)并不存在。但是,PHP文档说&#34; ...如果文件不存在,Warning: fopen(/files/ArtOfCode/icon.png): failed to open stream: No such file or directory in /home/u875642593/public_html/upload/action.php on line 26 Warning: fclose() expects parameter 1 to be resource, boolean given in /home/u875642593/public_html/upload/action.php on line 27 将在尝试使用它之前创建它。&#34;支持目录树确实存在,所以我很难过。如何进行此调用创建文件?

1 个答案:

答案 0 :(得分:2)

PHP的文件系统功能如fopen()及其兄弟姐妹在文件系统路径上运行,而不是在与Web服务器的文档根目录相关的路径上运行(&#34; web&#34; paths)。 (如果您的PHP安装如此配置,它们也可能在http://example.com/file.txt之类的流上运行,但这里没有相关性。)

由于您fopen()的路径以/开头,因此文件系统会在文件系统的根目录中查找它。文件系统路径开头的/始终表示绝对路径而不是相对路径,并且目录结构实际上并不存在于该绝对位置。

您需要找到位于Web服务器文档根目录中的files/目录。从uploads/目录中的PHP脚本访问它,您可以使用..伪目录来执行此操作,这意味着&#34;一个目录更高&#34;并且是获取兄弟目录的好方法。

$target_dir = "../files/" . usernameIs() . "/";

以上结果是相对路径。您可以将其包装在realpath()中以将其展开为完整路径。

我会更频繁地使用__DIR__常量来获取当前文件的目录,然后使用..遍历

$target_dir = __DIR__ . "/../files/" . usernameIs() . "/";

最后,$_SERVER['DOCUMENT_ROOT']也是一个选项。在您的情况下,files/位于Web服务器文档根目录中,因此您也可以使用:

$target_dir = $_SERVER['DOCUMENT_ROOT'] . "/files/" . usernameIs() . "/";

您也可以考虑定义一个保留应用程序的文件系统根目录的常量,在执行include/require等时可以参考该常量。

define("APPLICATION_ROOT", '/home/u875642593/public_html');

但是,在您的确切情况下,并没有太多收获,因为您的项目已经在文档根目录。如果您需要将其移动到其他目录,它会有所帮助,例如,如果您在/home/u875642593/public_html/dev中保留了开发版本。