【发布时间】:2018-02-28 20:48:05
【问题描述】:
我有一个正常工作的单个图像的文件上传方法,使用以下代码:
$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 在这里是UploadedFile 的一个实例,store() 方法完美运行。
但是,我需要更改方法以允许上传多个文件。以下改编的代码会产生以下错误:
$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 的dd 输出:
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
}
这很奇怪,因为 Laravel 应该使用具有正确 store() 方法(docs)的 Illuminate\Http\UploadedFile 来对抗没有该方法的 Symfony 类(docs)
另外,使用 Symfony 的 move() 更糟糕,因为 store() 已经使用生成的文件名和扩展名保存文件,所以我不必费心生成随机文件名并猜测扩展名,因为它不是非常可靠。
底线是:为什么会这样,我怎样才能让它使用正确的类实例?
【问题讨论】:
-
dd(get_class($p));输出什么? -
"Symfony\Component\HttpFoundation\File\UploadedFile" -
上一次上传工作中
dd(get_class($request->file('file')的输出:"Illuminate\Http\UploadedFile" -
那似乎是你的问题,你最终得到了一个底层的 Symfony
UploadedFile,它似乎没有store方法。出于兴趣,你为什么要做内部foreach循环? -
$request->files给了我一个FileBag,这反过来给了我一个文件数组。我也觉得很奇怪。是的,正如我的问题所述,这是根本问题。关键是为什么会发生这种情况。
标签: php laravel file symfony upload