解决此问题已有2天,但仍然无法解决。我正在尝试将多个文件上传到我的Laravel项目中的存储中。我知道我的代码在用dd测试时达到了foreach的要求。
我的控制器:
$files = $request->file('current_plan_year_claims_data_file_1');
$folder = public_path(). "\storage\\$id";
if (!File::exists($folder)) {
File::makeDirectory($folder, 0775, true, true);
}
if (!empty($files)) {
foreach($files as $file) {
Storage::disk(['driver' => 'local', 'root' => $folder])->put($file->getClientOriginalName(), file_get_contents($file));
}
}
答案 0 :(得分:3)
我看到您正在尝试将文件直接存储在public
文件夹中,但是为什么不使用Laravel的Storage
API并使用公用磁盘呢?您可以执行以下操作将文件上传到公共目录:
$id = 123;
$files = $request->file();
$folder = $id;
if (count($files) > 0) {
foreach ($files as $file) {
$file->store($folder, ['disk' => 'public']);
}
}
并确保已将存储路径链接到public:
php artisan storage:link
关注$files = $request->file();
行。如果您没有将参数传递给file()
方法,则将返回所有上传的文件实例。现在,当您遍历$files
数组时,就可以访问单个上载的文件。
然后,您可以使用逻辑存储文件,即可以使用原始名称或其他名称。甚至您都可以使用Storage
门面来处理文件实例。
即如果您想使用原始名称存储文件,我发现这是一种更干净的方法,而不是您正在做的事情:
$id = 123;
$files = $request->file();
$folder = $id;
if (count($files) > 0) {
foreach ($files as $file) {
Storage::disk('public')->putFileAs(
$folder,
$file,
$file->getClientOriginalName()
);
}
}
正如@cbaconnier所建议的,您也可以使用allFiles()
方法,它更具描述性:
$files = $request->allFiles();
我希望这会有所帮助。
答案 1 :(得分:1)
您正在尝试遍历文件,而file只是对request-> file()的引用,后者是单个UploadedFile
对象。
如您的注释所示,您有多个具有不同名称属性的文件输入,因此,您无法轻松地用一条语句遍历它们,例如:如果您有多个文件都以“ attachments []”的形式上传name属性,您可以使用$request->allFiles('attachments')
将其全部获取,但是,如果您想保持输入名称不变,则应该与您想要的名称接近。
public function foo(Request $request, $id){
$folder = public_path(). "\storage\\$id";
if (!File::exists($folder)) {
File::makeDirectory($folder, 0775, true, true);
}
$files = array();
$files[] = $request->file('current_plan_year_claims_data_file_1');
$files[] = $request->file('prior_plan_year_claims_data_file_1');
$files[] = $request->file('etc_file_whatever');
foreach($files as $file) {
Storage::disk(['driver' => 'local', 'root' => $folder])->put($file->getClientOriginalName(), file_get_contents($file));
}
}
请注意,我不确定您对File和public_path的处理方式,但是如果您的目标只是将某些内容放入应用存储中,则类似的操作应该可以
public function foo(Request $request, $id){
if(!\Storage::exists($id)){
\Storage::makeDirectory($id);
}
$files = array();
$files[] = $request->file('current_plan_year_claims_data_file_1');
$files[] = $request->file('prior_plan_year_claims_data_file_1');
$files[] = $request->file('etc_file_whatever');
foreach($files as $file) {
\Storage::put("$id/" . $file->getClientOriginalFileName(), $file);
}
}