2017-09-19 3 views
1

ich eine Datei-Upload-Methode für ein einzelnes Bild haben ordnungsgemäß funktioniert, mit dem folgenden Code:Laravel - store() -Methode plötzlich nicht funktioniert

$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 ist eine Instanz von UploadedFile hier, und die store() Methode funktioniert perfekt.

Allerdings musste ich die Methode ändern, damit mehrere Dateien hochgeladen werden können. Das folgende angepasst Code Netze der folgenden Fehler:

$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 Ausgang:

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 
} 

das ist ziemlich seltsam, wie Laravel Illuminate\Http\UploadedFile verwendet werden soll, die die richtigen store() hat Methode (docs) gegen Symfony-Klasse, die diese Methode nicht hat (docs)

Auch die Verwendung von Symfony move() ist viel schlimmer, wie store() speichert bereits die Datei mit einem generierten Dateinamen und der Erweiterung, so muss ich nicht die Erzeugung eines zufälligen Dateinamen und erraten die Erweiterung, da es nicht sehr zuverlässig ist.

Fazit ist: warum verhält es sich so, und wie kann ich es die richtige Klasseninstanz verwenden?

+0

Was bedeutet 'dd (get_class ($ p));' Ausgang? – Jonathon

+0

'" Symfony \ Component \ HttpFoundation \ Datei \ UploadedFile "' –

+0

Ausgabe von 'dd (get_class ($ request-> file ('file')' 'von dem vorherigen funktionierenden einzelnen Upload:' "Illuminate \ Http \ UploadedFile" ' –

Antwort

2

Sie können nur die Speichermethode verwenden, die Sie für eine Anforderungsinstanz verwenden.

Vielleicht könnten Sie versuchen, etwas zu tun, wie diese

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

'$ Anfrage-> Datei ('Dateien')' wirft eine Ausnahme IIRC, habe ich versucht, etwas ähnliches vor. Ich werde versuchen, diesen Ansatz zu bestätigen. –

+0

'$ Fotos = $ Anfrage-> Datei ('Dateien'); foreach ($ fotos als $ foto) { if ($ photo-> isValid()) { $ pfad = $ foto-> speicher ($ anfrage-> subdomain); {...} 'gearbeitet! Jetzt habe ich ein anderes Problem, wo es nicht alle Fotos speichert, die ich lade, aber das ist ein ganz anderes Geschäft. Vielen Dank! –

+0

Ich bin froh, Ihnen helfen zu können. –

Verwandte Themen