Php Laravel fopen()无法创建/读取文件

Php Laravel fopen()无法创建/读取文件,php,json,laravel,file,fopen,Php,Json,Laravel,File,Fopen,我有一个Laravel项目,我想将一个数组导出到一个json文件,以便以后使用。我对存储文件夹的权限为777,但当我这样做时 $line=[ 'key1'=>'value1', ]; file_put_contents("storage/app/test.json",json_encode($line)); 我也试过了 $line=[ 'key1'=>'value1', ]; file_put_contents($_SERVER['DOCUMENT_ROOT']."/sto

我有一个Laravel项目,我想将一个数组导出到一个json文件,以便以后使用。我对存储文件夹的权限为777,但当我这样做时

$line=[
  'key1'=>'value1',
];
file_put_contents("storage/app/test.json",json_encode($line));
我也试过了

$line=[
  'key1'=>'value1',
];
file_put_contents($_SERVER['DOCUMENT_ROOT']."/storage/app/test.json",json_encode($line));
在这两种情况下(加上更多),我都会得到这个错误

file_put_contents(storage/app/test.json): failed to open stream: No such file or directory
你知道为什么会这样吗


编辑:文件夹存在

在尝试将文件放入目录之前,无论权限如何,目录都必须存在。我想这就是正在发生的事情。同样,您可以在
存储
文件夹中设置权限,但不能在
应用程序
文件夹中设置权限。

您正在使用存储文件夹,但默认情况下,路径取自公共,这就是您需要使用
的原因。

像这样试试

$file=fopen('../storage/app/test.json','w');
fwrite($file,json_encode($line));
fclose($file);

您可以使用

您可以使用Laravel的助手方法base\u path():

base_path函数将完全限定路径返回到项目根目录

例如:


Hie团队,我面临着一个更类似的问题。因此,我有一个保存在存储/cpdpoints中的文件,但我想读取该文件,然后将其移动到公用文件夹

项目/公共/CDP点

我试过以下方法

    $file = Storage::path($path);
    $file = fopen($file, 'r');

    if ($file) {
          

            //get file original name
            $name = $file->getClientOriginalName();

            //create a unique file name using the time variable plus the name
            $file_name = time() . $name;

            //upload the file to a directory in Public folder
            $path = $file->move('cpdpoints', $file_name);
        }

存储
中是否有文件夹
app
?当然,我也有该文件,但如果它不存在,我希望它自动创建该文件!在路径之前需要这两个点,我认为这是因为它需要从“公共”文件夹上升。谢谢当你的问题得到解决时,欢迎你接受我的回答并给我一个大拇指:)当然!Stackoverflow不让我这么做,我得等一会儿minutes@DimitriosStefos既然您使用的是Laravel,那么您最好尽可能使用Storage facade。可以找到文档。这只是一个包装,但你可能不会碰到这个。太好了!又快又简单!谢谢@
    $file = Storage::path($path);
    $file = fopen($file, 'r');

    if ($file) {
          

            //get file original name
            $name = $file->getClientOriginalName();

            //create a unique file name using the time variable plus the name
            $file_name = time() . $name;

            //upload the file to a directory in Public folder
            $path = $file->move('cpdpoints', $file_name);
        }