Warm tip: This article is reproduced from serverfault.com, please click

php- Laravel

(php - Laravel)

发布于 2017-09-19 23:21:13

我有使用以下代码的单张图像正常工作的文件上传方法:

$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);
}

$fileUploadedFile此处的一个实例,并且该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()

$pdd输出:

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应该使用Illuminate\Http\UploadedFile具有适当store()方法(docs)的Symfony的类,而该类没有该方法(docs

另外,使用Symfony的move()情况更糟,因为store()已经使用生成的文件名和扩展名保存了文件,所以我不必费心生成随机文件名并猜测扩展名,因为它不是很可靠。

最重要的是:为什么它表现得如此,如何使它使用适当的类实例?

Questioner
jacques mouette
Viewed
0
Jerico Pulvera 2017-09-20 08:18:04

你只能在请求实例上使用存储方法。

也许你可以尝试做这样的事情

foreach($photo as $index => $p) {
    $request->file('files')[$index]->store();
}