2013-09-27 2 views
22

У меня есть форма, где среди другой информации пользователь загружает изображение. Я хочу сохранить путь к изображению в базе данных и сохранить изображение в папке public/img/ на сервере.Laravel 4 - Загрузка файла

Форма открыта с использованием: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }}, так что она сможет обрабатывать файлы POST. Проверка HTML я на следующие:

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

я могу отправить на мой контроллер и получить все данные из формы, как и ожидалось. Обработки файла метод заключается в следующем:

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 
} 

Когда я выбираю файл и отправить форму, все, кажется, работает, за исключением того, что ни один файл не будет сохранен на папке /img. База данных правильно регистрирует путь и имя файла.

Запуск dd($uploadSuccess); права после if { ...} блока, я получаю следующее:

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

Что я делаю неправильно?

+3

В дополнение к ответу от [Reflic], то это будет необходимо отрегулировать 'path' в базе данных следующим образом:' 'путь '=>' img/'. $ filename]); ' –

+0

Правильно, я забыл об этом. – Reflic

ответ

33

Ваш $ destination_path неправ. Вы должны указать путь к/общедоступному каталогу в вашем переменных $ назначения, как это:

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

3

Так как вы по всей видимости, с помощью PHP 5.4 вы можете также рассмотреть вопрос об использовании Stapler. Сейчас он довольно стабилен (скоро будет неактуально бета-версия) и избавит вас от многих шаблонов, которые вам нужно написать прямо сейчас.

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

ответ дается @Reflic может бр право ... но не для меня ....
этот путь работал для меня.
это может быть, потому что я удалил «public /» из url ... спасибо.

1

У меня была та же проблема. Я получил все правильно мой код для

public_path() 

за исключением Был не предваряя в моей папке

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

Я также сделал это, чтобы изменить мое имя файла

Я получил расширение файла

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

И все, имя файла изменено. Laravel действительно замечательный

1

вы также можете написать относительный путь. вроде как

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

или

$destinationPath= 'public/img/';

Смежные вопросы