1

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

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

用户在请求中上传 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 命令由另一个用户 ( akshay) 运行,而requests目录由 www-data 创建。

因此,根据我的说法,这里有可能解决此问题的方法。

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

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

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

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

4

3 回答 3

1

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

为 www-data 用户创建 cronjob

sudo -u www-data cronjob -e

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

于 2018-03-20T20:57:21.807 回答
0

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

于 2019-01-08T16:36:23.720 回答
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/... 删除或更新文件,它会自动对 storage/app/... 路径中的文件进行更改。

希望它会有所帮助!

于 2018-01-19T08:43:48.353 回答