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


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

Форма была открыта с помощью: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }}, чтобы она могла публиковать файлы. Просматривая 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" }

Что я делаю не так?

Author: George Rivera, 2013-09-28

5 answers

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

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

 33
Author: Reflic, 2013-09-27 21:45:10

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

 3
Author: Travis Bennett, 2013-11-13 03:01:20
$destinationPath= public_path() . 'img/';

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

 1
Author: arpit desai, 2014-05-26 12:19:35

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

public_path()

Не добавлялся в мою папку

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

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

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

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

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

 1
Author: blakroku, 2014-06-02 22:37:12

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

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

Или

$destinationPath= 'public/img/';

 1
Author: Md Shahadat Hossain, 2016-01-02 21:45:56