2013-09-27 18 views
22

Mam formularz, w którym wśród innych informacji użytkownik może przesłać obraz. Chcę zapisać ścieżkę do obrazu w bazie danych i zapisać obraz w folderze public/img/ na serwerze.Laravel 4 - Przesyłanie plików

Formularz został otwarty przy użyciu: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }}, dzięki czemu będzie mógł otwierać pliki POST. Sprawdzając kod HTML mam następujące informacje:

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

Mogę POSTOWAĆ do mojego kontrolera i otrzymać wszystkie dane z formularza zgodnie z oczekiwaniami. Sposób obchodzenia się z pliku jest następująca:

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 
} 

Kiedy wybrać plik i przesłać formularz, wszystko wydaje się działać, chyba że plik nie jest zapisany w folderze /img. Baza danych prawidłowo rejestruje ścieżkę i nazwę pliku.

Running dd($uploadSuccess); zaraz po bloku if { ...}, mam następujące:

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

Co robię źle?

+3

W uzupełnieniu odpowiedzi z [Reflic], to będzie konieczne, aby dostosować 'path' w bazie danych w następujący sposób:' 'ścieżkę '=>' img/'. $ filename]); ' –

+0

To prawda, zapomniałem tego. – Reflic

Odpowiedz

33

Twoja $ destination_path jest niepoprawna. Trzeba zawierać ścieżkę do katalogu publicznym/w zmiennej $ przeznaczenia tak:

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

3

Ponieważ wydaje się być za pomocą php 5.4 może również rozważyć użycie Stapler. Jest teraz dość stabilny (wkrótce zniknie z wersji beta) i uratowałby cię od wielu elementów, które musisz teraz napisać.

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

odpowiedź udzielona przez @Reflic może BR rację ... ale nie dla mnie ....
ta ścieżka pracował dla mnie.
może dlatego, że usunąłem "public /" z adresu URL ... dziękuję.

1

Miałem ten sam problem. Mam wszystko dobrze z moim kodem wyjątkiem

public_path() 

Czy nie poprzedzenie do mojego folderu

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

Zrobiłem to również zmienić moje imię plik

mam rozszerzenie pliku

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

I to jest to, nazwa pliku została zmieniona. Laravel jest rzeczywiście wspaniały

1

możesz również wpisać względną ścieżkę. jak jak

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

lub

$destinationPath= 'public/img/';