Подтвердить что ты не робот

Laravel 4 - Загрузка файлов

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

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

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

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

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

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

4b9b3361

Ответ 1

Ваш $destination_path неверен. Вы должны указать путь к директории /public в переменной $destination следующим образом:

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

public_path()

Не было добавлено к моей папке

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

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

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

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

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

Ответ 5

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

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

или

$destinationPath= 'public/img/';