无法创建根目录

Impossible to create the root directory

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

首先,这是我的任务详情。

用户在请求中上传了 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 中设置了一些 artisan 命令来处理用户请求。而且我必须将该过程的输出存储在该请求目录中,即 storage/app/requests/{$userRequest->id}/output/output_1.csv.

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

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

Impossible to create the root directory

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

根据我的说法,这里有一些可能的解决方法。

  1. 运行 www-data 用户的 artisan 命令。
  2. 创建请求目录并以用户 akshay 作为所有者上传文件。

许多用户建议更改目录的所有者。例如,。但正如我们所见,在我的例子中,目录的创建是完全动态的。所以我不能那样做。但我不知道如何使用 laravel 执行上述任何操作。

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

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

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

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

所以你必须先从request.Give文件中得到它的名字。然后确定文件应保存的路径。然后创建该目录。接下来移动文件 there.If 上传文件的扩展名是 .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

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

希望对您有所帮助!

在为此苦苦思索了一整天之后,我决定使用简单的解决方案:

为 www-data 用户创建 cronjob

sudo -u www-data cronjob -e

希望对您有所帮助,我在使用 cron 作业、artisan 命令和目录时确实找不到最佳解决方案。

我的系统在 Debian 机器上抛出了这个异常,因为路径不存在,因为挂载没有重新挂载。 (所以 mount -a 作为 root 工作。)