Laravel将文件上传到资源

时间:2014-09-26 14:37:11

标签: file-upload laravel

在Laravel我有一个资源控制器,我需要处理图片上传。在我的create.blade.php中,我有以下形式:

{{ Form::open(array('action' => 'PhotoController@store', 'method' => 'post')); }}
{{Form::text('text'); }}
{{Form::file('photo');}}
{{Form::submit('Submit');}}
{{ Form::close() }}

在我的PhotoController中,我有以下商店功能

public function store()
{
    if (Input::hasFile('photo'))
    {
         return 'Got the photo';
    }
    else { return Input::get('text'); }
}

返回字段'text'的输入,但是看起来Laravel似乎找不到我上传的照片。 我试图改变方法来放置和创建一个自定义函数来处理这个,但结果相同。为什么我不能让Laravel认出我附加了一个文件?

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要将'files' => true'enctype' =>"multipart/form-data"添加到表单中,如此

{{ Form::open(array('action' => 'PhotoController@store', 'method' => 'post', 'files' => true, 'enctype' =>"multipart/form-data")); }}

关于POSTPUT选项,这取决于您正在做什么。在使用store资源方法时,您应该使用POST。如果您要使用update方法,则可以使用PUT

对于资源控制器,方法和HTTP请求的工作方式如下

 +-------------------+-------------+
 | Controller method | HTTP Method |
 +-------------------+-------------+
 | index             | GET         |
 | create            | GET         |
 | store             | POST        |
 | show              | GET         |
 | edit              | GET         |
 | update            | PUT / PATCH |
 | destroy           | DELETE      |
 +-------------------+-------------+

令人困惑的是createedit您可能认为应该是POST,但请记住这是“得到”的网页。表单以编辑或创建项目。

收到文件后,您需要对其进行操作。因此,接下来您将要对文件执行某些操作,因此您需要

$photo = Input::file('photo');
$photo->move($destinationPath, $fileName);

可以在Laravel documentation here中找到有关这些和所有其他Input::file()方法的文档。

答案 1 :(得分:0)

{{ Form::open(array('route' => 'images.store', 'role' => 'form', 'files' => true)) }}

这是我用于文件上传表单的内容,我没有'enctype''method',我指的是路线而非行动。

这是HTML中的翻译内容:

<form method="POST" action="action url" accept-charset="UTF-8" role="form" enctype="multipart/form-data"><input name="_token" type="hidden" value="token value">

正如您所见,'enctype'帮助函数添加了'method'Form::openrole="form" {{1}}用于正确格式化表单。

关于HTML和表单:Bootstrap