无法创建根目录

时间:2018-01-19 07:25:19

标签: laravel laravel-5 file-permissions artisan laravel-filesystem

我已经搜索过这个问题了。但每个问题/博客的任务都不同。所以这些答案或解决方案与我无关。

首先,这里是我的任务细节。

用户在请求中上传CSV文件。我正在使用laravel的文件系统(本地驱动程序)存储该文件。

$path = $request->file('csv_file')->storeAs('requests/' . $userRequest->id, 'input.csv');

这样CSV文件将存储为storage/app/requests/{$userRequest->id}/input.csv。我检查了requests目录的所有者,它是www-data

现在我在cronjobs中设置了一些工匠命令来处理用户请求。我必须将该流程的输出存储在该请求目录中,即storage/app/requests/{$userRequest->id}/output/output_1.csv

$file = 'requests/' . $userRequest->id . '/output/' . $outputfilename . '.csv';
\Storage::put($file, $content);

但是在创建输出文件时,它会抛出错误

  

无法创建根目录

我知道原因。这是因为所有者运行artisan命令。 Artisan命令由另一个用户(akshay)运行,而requests目录由www-data创建。

所以这里有可能的方法来解决这个问题。

  1. 由www-data用户运行artisan命令。
  2. 创建请求目录并以用户akshay作为所有者上传文件。
  3. 许多用户建议更改目录的所有者。例如,this one。但正如我们所看到的,在我的例子中,目录的创建是完全动态的。所以我不能这样做。但是我不知道怎么用laravel做上面的任何一个。

    我更喜欢选项(2),因为www-data用户只会执行“请求文件上传”。所有其他执行将由akshay用户完成。例如,我只需要上传文件一次。但我必须将过程输出存储500次。

    如果有人知道答案,我们将不胜感激。

3 个答案:

答案 0 :(得分:1)

经过一整天的努力,我决定使用简单的解决方案:

为www-data用户创建cronjob

sudo -u www-data cronjob -e

我希望它有所帮助,在使用cron作业,工匠命令和目录时,我找不到最佳解决方案。

答案 1 :(得分:0)

这与目录的所有者无关。我曾经遇到过这个问题。您必须检查是否存在使用File :: makeDirectory方法创建的目录:

  File::exists(storage_path($csvPath )) or File::makeDirectory(storage_path($csvPath ));

所以你必须先从请求中获取文件。给它一个名字。然后确定应保存文件的路径。然后制作该目录。接下来将文件移到那里。如果上传文件的扩展名为.csv,您只需通过此$ file-> getClientOriginalExtension()获取该扩展名,然后保存该文件。如果原始扩展名不是csv,你可以通过.csv自己创建,你应该做以下代码:

      $file = $request->file('csv_file');

      $name = $outputfilename . "." .$file->getClientOriginalExtension();

      $csvPath = '/requests/' . $userRequest->id . '/output/';

      File::exists(storage_path($csvPath )) or File::makeDirectory(storage_path($csvPath ));

      $file->move(storage_path() . '/requests/' . $userRequest->id . '/output/', $name);

因此,请确保首先检查目录是否存在,然后通过检查目录是否存在来创建目录。

然后,如果使用laravel 5.3或更高版本访问该csv_file,则在命令行中键入以下命令:

php artisan storage:link

这将在您的公共目录中创建名为storage的存储链接。这样你就可以从那里访问文件。如果您删除或通过public / storage /更新文件...它会自动对存储/ app / ...路径中的文件进行更改。

希望它会有所帮助!

答案 2 :(得分:0)

我的系统在Debian盒子上抛出了此异常,因为该路径不存在,因为尚未重新安装挂载。 (因此mount -a作为root起作用。)