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" }
Что я делаю не так?
5 answers
Ваш $destination_path неверен. Вы должны указать путь к каталогу /public в вашей переменной $destination следующим образом:
$destinationPath = public_path().'/img/';
Поскольку вы, похоже, используете php 5.4, вы также можете рассмотреть возможность использования степлера. Сейчас он довольно стабилен (очень скоро выйдет из бета-версии) и избавит вас от многих стандартных шаблонов, которые вам приходится писать прямо сейчас.
$destinationPath= public_path() . 'img/';
Ответ, данный @Reflic, может быть правильным... но не для меня....
этот путь сработал для меня.
это может быть потому, что я удалил "public/" из URL-адреса...
спасибо.
У меня была та же проблема. Я все правильно понял в своем коде, за исключением
public_path()
Не добавлялся в мою папку
$destinationPath= public_path() . '/img/'; // Worked perfect
Я также сделал это, чтобы изменить имя своего файла
Я получил расширение файла
$extension = Input::file('YourFileName')->getClientOriginalExtension();
$filename = WhateverYouWantHere . '.' . $extension;
И все, имя файла изменено. Ларавель действительно замечательный
Вы также можете написать относительный путь. как
$destinationPath="resources/assets/images/";
Или
$destinationPath= 'public/img/';