file_put_contents:无法打开流,没有这个文件或目录

22

我正尝试使用dompdf将表单保存为易于阅读的.pdf文件,我的处理脚本如下。我收到以下错误信息:警告:file_put_contents(/files/grantapps/NAME0.pdf) [function.file-put-contents]:无法打开流:没有该文件或目录,位于/home/username/public_html/subdir/apps/dompdf/filename.php第39行(第39行是完整脚本的最后一行)。我不知道如何解决这个问题。

allow_url_fopen已启用,并且我已经尝试了各种文件路径,包括完整目录(/home/username/public_html/subdir/files/grantapps/)和以下代码中的路径,但都没有起作用。

require_once("dompdf_config.inc.php");
date_default_timezone_set('America/Detroit');

$html = 'code and whatnot is here';

$name = str_replace(" ", "", $_POST['form2name']);
$i = 0;
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
while(file_exists("files/grantapps/" . $name . $i . ".pdf")) {
    $i++;
}
file_put_contents("files/grantapps/" . $name . $i . ".pdf", $dompdf->output());

用户可以多次提交表单,由于我使用他们的姓名作为文件名,我希望它只是在结尾添加一个数字,并将每个文件保存为新文件名,而不是覆盖现有文件。 - vaindil
为什么不使用 $dompdf->stream("files/grantapps/" . $name . $i . ".pdf");? - luckystars
stream()函数会导致文件下载,并且只接受文件名作为参数。我想将文件保存在Web服务器和其他位置,使用file_put_contents()是实现这一目的的方法。 - vaindil
对于任何遇到相同错误信息并来到这个帖子的人,我的情况是由于一个无效的文件名(它包含了一个/)引起的。 - Samuel Gfeller
2个回答

43

目标文件夹路径存在问题。

你上面的错误信息表明,它希望将内容放到目录/files/grantapps/中的文件中,该文件夹位于你的vhost之外,而是在系统中某处(请参见前导绝对斜杠)

你应该仔细检查:

  • /home/username/public_html/files/grantapps/目录是否真实存在。
  • 你的循环和file_put_contents语句中是否包含了绝对路径/home/username/public_html/files/grantapps/

11
我是世界上最大的白痴。除了创建 /grantapps/ 目录之外,我已经尝试了所有的方法。创建该目录并返回完整的链接后问题得到解决。非常抱歉,非常感谢! - vaindil
2
我有同样的问题,所有路径都设置得非常完美,但它仍然抛出相同的错误。 - gegobyte
1
对我来说重要的部分是使用绝对路径,我之前一直在使用~/ - Tibo
对于任何遇到相同错误信息并来到这个帖子的人,我的情况是由于一个无效的文件名(它包含了一个/)引起的。 - Samuel Gfeller
在我的情况下,路径和目标文件都存在,但是php没有写入它的权限(通过chmod修复了):-/ - undefined

8

我也曾遇到过相同的问题,并按照以下简单步骤解决了它。

只需获取您想要复制的文件的确切网址,例如:

http://www.test.com/test.txt (file to copy)

然后,您需要传递包含文件名的确切绝对文件夹路径,以便在该文件夹中编写该文件。

  1. 如果您在Windows机器上,则为 d:/xampp/htdocs/upload/test.txt

  2. 如果您在Linux机器上,则为 /var/www/html/upload/test.txt

您可以使用PHP函数$_SERVER['DOCUMENT_ROOT']获取文档根目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接