2013-09-27 18 views
22

Ich habe ein Formular, wo unter anderem ein Benutzer ein Bild hochladen würde. Ich möchte den Pfad zum Image in der Datenbank speichern und das Image im Ordner public/img/ auf dem Server speichern.Laravel 4 - Datei-Upload

Das Formular wurde geöffnet mit: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }}, so dass es in der Lage wäre, Dateien zu senden. Inspizieren des HTML Ich habe die Folowing:

<form method="POST" action="http://mypizza/pizzas" 
    accept-charset="UTF-8" enctype="multipart/form-data"> 

Ich kann mein Controller-POST und alle Daten aus dem Formular erhalten, wie erwartet. Die Methode, die Datei Handhabung ist wie folgt:

public function store() { 
    //TODO - Validation 

    $destinationPath = ''; 
    $filename  = ''; 

    if (Input::hasFile('image')) { 
     $file   = Input::file('image'); 
     $destinationPath = '/img/'; 
     $filename  = str_random(6) . '_' . $file->getClientOriginalName(); 
     $uploadSuccess = $file->move($destinationPath, $filename); 
    } 


    $pizza = Pizza::create(['name'  => Input::get('name'), 
          'price'  => Input::get('price'), 
          'ingredients' => Input::get('ingredients'), 
          'active'  => Input::get('active'), 
          'path'  => $destinationPath . $filename]); 

    if ($pizza) { 
     return Redirect::route('pizzas.show', $pizza->id); 
    } 

    //TODO - else 
} 

Wenn ich eine Datei auswählen und das Formular abschicken, alles scheint zu funktionieren, mit der Ausnahme, dass keine Datei auf dem /img Ordner gespeichert wird. Die Datenbank registriert den Pfad und den Namen der Datei korrekt.

Lauf dd($uploadSuccess); direkt nach dem if { ...} Block, erhalte ich folgendes:

object(Symfony\Component\HttpFoundation\File\File)#220 (2) { 
    ["pathName":"SplFileInfo":private]=> string(17) "/img\YZmLw7_2.jpg" 
    ["fileName":"SplFileInfo":private]=> string(12) "YZmLw7_2.jpg" } 

Was mache ich falsch?

+3

Neben der Antwort von [Reflic], wird es notwendig sein, die 'path' auf der Datenbank wie folgt anzupassen:' 'Pfad '=>' img/'. $ filename]); ' –

+0

Das ist richtig, ich habe das vergessen. – Reflic

Antwort

33

Ihr $ Zielpfad ist falsch. Sie haben den Pfad zum/public-Verzeichnis in Ihrem Variable $ Ziel wie folgt umfassen:

$destinationPath = public_path().'/img/';

3

Da Sie PHP 5.4 Sie auch Stapler verwenden könnten mit zu sein scheinen betrachten. Es ist jetzt ziemlich stabil (wird in Kürze die Betaversion verlassen) und würde dich vor einer Menge von dem, was du gerade schreiben musst, retten.

1
$destinationPath= public_path() . 'img/'; 

Antwort von @Reflic gegeben kann direkt br ... aber nicht für mich ....
dieser Weg für mich gearbeitet.
kann es, weil ich "public /" von url entfernt ... danke.

1

Ich hatte das gleiche Problem. Ich habe alles richtig über meinen Code mit Ausnahme der

public_path() 

War das Voranstellen nicht auf die meine Ordner

$destinationPath= public_path() . '/img/'; // Worked perfect 

ich auch tat dies auf meine Dateinamen

ich die Dateierweiterung bekam ändern

$extension = Input::file('YourFileName')->getClientOriginalExtension(); 
$filename = WhateverYouWantHere . '.' . $extension; 

Und das ist es, Dateiname geändert. Laravel ist in der Tat wunderbar

1

können Sie relativen Pfad auch schreiben. wie als

$destinationPath="resources/assets/images/";

oder

$destinationPath= 'public/img/';