2013-09-27 25 views
22

Ho un modulo in cui, tra le altre informazioni, un utente potrebbe caricare un'immagine. Voglio memorizzare il percorso dell'immagine sul database e salvare l'immagine nella cartella public/img/ sul server.Laravel 4 - Caricamento file

Il modulo è stato aperto utilizzando: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }} in modo che sarebbe in grado di file POST. Ispezione del codice HTML che ho il folowing:

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

posso pubblicare nel mio Controller e ricevere tutti i dati dal modulo come previsto. La gestione del file metodo è il seguente:

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 
} 

Quando seleziono un file e inviare il modulo, tutto sembra funzionare, tranne che nessun file viene salvato nella cartella /img. Il database registra correttamente il percorso e il nome del file.

Esecuzione dd($uploadSuccess); a destra dopo il blocco if { ...}, ottengo il seguente:

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" } 

Che cosa sto facendo di sbagliato?

+3

Oltre alla risposta da [Reflic], sarà necessario regolare la 'path' sul database come segue:' 'percorso '=>' img/'. $ nomefile]); ' –

+0

Proprio così, l'ho dimenticato. – Reflic

risposta

33

Il tuo $ destination_path è sbagliato. È necessario includere il percorso della directory pubblica/nel tuo $ destinazione variabile in questo modo:

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

3

Dal momento in cui sembra essere utilizzando PHP 5.4 si potrebbe anche considerare l'utilizzo di Stapler. È abbastanza stabile ora (sarà fuori beta molto presto) e ti risparmierebbe da un sacco di informazioni che stai scrivendo proprio ora.

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

risposta data dal @Reflic può br destra ... ma non per me ....
questo percorso ha funzionato per me.
potrebbe perché ho rimosso "pubblico /" dall'URL ... grazie.

1

ho avuto lo stesso problema. Ho avuto tutto quello che di destra circa il mio codice ad eccezione del

public_path() 

Non era anteponendo alla mia cartella di

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

ho fatto anche questo per cambiare il mio nome di file

ho ottenuto l'estensione del file

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

E questo è, il nome del file è cambiato. Laravel è davvero meraviglioso

1

puoi scrivere anche il percorso relativo. come come

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

o

$destinationPath= 'public/img/';