我已经搜索过这个问题了。但每个问题/博客的任务都不同。所以这些答案或解决方案与我无关。
首先,这里是我的任务细节。
用户在请求中上传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创建。
所以这里有可能的方法来解决这个问题。
akshay
作为所有者上传文件。许多用户建议更改目录的所有者。例如,this one。但正如我们所看到的,在我的例子中,目录的创建是完全动态的。所以我不能这样做。但是我不知道怎么用laravel做上面的任何一个。
我更喜欢选项(2),因为www-data
用户只会执行“请求文件上传”。所有其他执行将由akshay
用户完成。例如,我只需要上传文件一次。但我必须将过程输出存储500次。
如果有人知道答案,我们将不胜感激。
答案 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起作用。)