是的,关于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;支持目录树确实存在,所以我很难过。如何进行此调用创建文件?
答案 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
中保留了开发版本。