【问题标题】:Laravel - store() method suddenly not workingLaravel - store() 方法突然不起作用
【发布时间】: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()

$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 应该使用具有正确 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


【解决方案1】:

您只能在请求实例上使用您正在使用的 store 方法。

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

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

【讨论】:

  • $request->file('files') 抛出异常 IIRC,我之前尝试过类似的操作。我会尝试这种方法来确认。
  • $photos = $request->file('files'); foreach($photos as $photo) { if($photo->isValid()) { $path = $photo->store($request->subdomain); {...} 工作!现在我遇到了另一个问题,它没有保存我上传的所有照片,但这是另一回事。谢谢!
  • 很高兴能为您提供帮助。
【解决方案2】:

我也在为同样的错误而苦苦挣扎,上述解决方案有效: 这里有一个更详细的:

$result = [];
//$photos = $request->file('files'); // just saving the line
foreach($request->file('files') as $k => $v) {
        $path = Storage::disk('public')->putFile('editor/uploads/1', $request->file('files')[$k]);
        $filename = basename($path);
        $result['url'] = $filename;
}

return $result;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2014-11-16
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多