I have a file upload method for a single image working properly, using the following code:
$file = $request->file('file');
if ($file && $file->isValid()) {
$photo['size'] = $request->file('file')->getClientSize();
$path = $request->file('file')->store($request->subdomain);
$path = explode('/', $path);
$photo['file'] = $path[1];
$photo['cover'] = 1;
$photo['gallery'] = $newGallery->id;
$photo['uploaded_by'] = $user->id;
Photo::create($photo);
}
$file
is an instance of UploadedFile
here, and the store()
method works perfectly.
However, I needed to change the method to allow multiple files to be uploaded. The following adapted code nets the following error:
$photos = $request->files->all();
foreach($photos as $photo) {
foreach($photo as $p) {
if($p->isValid()) {
$path = $p->store($request->subdomain);
$path = explode('/', $path);
$newPhoto = [
'uploaded_by' => $user->id,
'file' => $path[1],
'size' => $p->getClientSize(),
'gallery' => $request->gallery,
'subdomain' => $request->subdomain,
];
Photo::create($requestData);
}
}
}
Call to undefined method Symfony\Component\HttpFoundation\File\UploadedFile::store()
$p
's dd
output:
UploadedFile {#28 ▼
-test: false
-originalName: "Untitled.png"
-mimeType: "image/png"
-size: 18030
-error: 0
path: "/tmp"
filename: "phpBDSWCR"
basename: "phpBDSWCR"
pathname: "/tmp/phpBDSWCR"
extension: ""
realPath: "/tmp/phpBDSWCR"
aTime: 2017-09-19 20:19:57
mTime: 2017-09-19 20:19:57
cTime: 2017-09-19 20:19:57
inode: 3014878
size: 18030
perms: 0100600
owner: 1000
group: 1000
type: "file"
writable: true
readable: true
executable: false
file: true
dir: false
link: false
}
Which is pretty strange, as Laravel should be using Illuminate\Http\UploadedFile
that has the proper store()
method (docs) against Symfony's class that doesn't have that method (docs)
Also, using Symfony's move()
is way worse, as store()
already saves the file with a generated filename and the extension, so I don't have to bother generating a random filename and guessing the extension, as it's not very reliable.
Bottom line is: why is it behaving like that, and how can I make it use the proper class instance?