php - 无法更新文件上传表单、laravel 表单绑定(bind)

标签 php forms laravel

您好,我必须编辑和更新带有文件上传的表单。当我编辑其他字段并上传照片时,它可以工作。但如果我编辑其他字段而不上传照片,则会显示错误“在非对象上调用成员函数 getClientOriginalName()”

我的看法

{{ Form::model($layer, array('method'=>'PATCH', 'route'=>array('edit-layer-patch', $layer->id), 'files'=> true)) }}


<div class="form-group">
    <input type="file" name="image" value="{{ $layer->img_path }}" class="form-control" onchange="readURL(this);" id="image" accept="image/*" />
    {{ HTML::image('uploads/'. $layer->img_path, 'your image', array('id' => 'blah', 'width'=>150, 'height' => 100)) }}
</div>

<div class="form-group">
    <label for="layer_name">Layer Name</label>
    <input type="text" class="form-control"  name="layer_name" value="{{ $layer->layer_name }}" />
</div>

<div class="form-group">    
<label for="select_user">Select User</label>
<select name="select_user" class="form-control">
    <option value="{{ $layer->user->id }}">{{ $layer->user->firstname }}</option>
    @foreach($users as $user)
    <option value="{{ $user->id }}">{{ $user->firstname }}</option>
    @endforeach
</select>
</div>

<div class="form-group">    
<label for="select_style">Select Style</label>
<select name="select_style" class="form-control">
    <option value="{{ $layer->style->id }}">{{ $layer->style->style_name }}</option>
    @foreach($styles as $style)
    <option value="{{ $style->id }}">{{ $style->style_name }}</option>
    @endforeach
</select>
</div>

<div class="form-group">    
<label for="select_category">Select Category</label>
<select name="select_category" class="form-control">
    @if(!empty($layer->category->category_name))
    <option value="{{ $layer->category->id }}">{{ $layer->category->category_name }}</option>
    @foreach($categories as $category)
    <option value="{{ $category->id }}">{{ $category->category_name }}</option>
    @endforeach
    @else
    <option value="">Deleted</option>
    @foreach($categories as $category)
    <option value="{{ $category->id }}">{{ $category->category_name }}</option>
    @endforeach
    @endif

</select>
</div>

<div class="form-group">
    <label for="published">Published</label>
    <input type="number" class="form-control" min="0" max="1"  name="published" value="{{ $layer->published }}" />
</div>

<div class="form-group">
    <label for="default">Default</label>
    <input type="number" class="form-control" min="0" max="1"  name="default" value="{{ $layer->default }}" />
</div>

<div class="form-group">
    <button class="btn btn-primary" type="submit">Update</button>
    <a class="btn btn-danger" href="{{ route('layers') }}">Cancel</a>
</div>

{{ Form::close() }}

我的 Controller

public function edit($id){

    $image = Input::file('image');

    $filename = $image->getClientOriginalName();

    $destinationPath = 'uploads/';

    $layer = Layer::find($id);

    $validator = Validator::make(Input::all(), Layer::$rules);

    if ($validator->fails()) {

        return Redirect::route('edit-layer')->withErrors($validator)->with('message', 'Ups something happened');
    }else{  
     //Image::make($image->getRealPath())->save($path);
        Input::file('image')->move($destinationPath, $filename);



        if(Input::has('image')){
            $layer->user_id       = Input::get('select_user');
            $layer->style_id      = Input::get('select_style');
            $layer->category_id   = Input::get('select_category');
            $layer->layer_name    = Input::get('layer_name');
            $layer->published     = Input::get('published');
            $layer->default       = Input::get('default');
            $layer->save(); 
        }else{
            $layer->user_id       = Input::get('select_user');
            $layer->style_id      = Input::get('select_style');
            $layer->category_id   = Input::get('select_category');
            $layer->layer_name    = Input::get('layer_name');
            $layer->published     = Input::get('published');
            $layer->default       = Input::get('default');
            $layer->img_path = $filename;
            $layer->save(); 
        }

        return Redirect::route('layers')->with('message','Layer Updated');
    }
}

请帮帮我,谢谢

最佳答案

因为你这样做:

$image = Input::file('image');
$filename = $image->getClientOriginalName();

即使您不上传图像(因此 $imagenull)

您需要将所有与图像相关的内容移至 if(Input::has('image')) 检查

public function edit($id){

    $destinationPath = 'uploads/';
    $layer = Layer::find($id);
    $validator = Validator::make(Input::all(), Layer::$rules);

    if ($validator->fails()) {
        return Redirect::route('edit-layer')->withErrors($validator)->with('message', 'Ups something happened');
    }else{  

        if(Input::has('image')){
            $image = Input::file('image');

            $filename = $image->getClientOriginalName();

            Input::file('image')->move($destinationPath, $filename);

            // ...
        }else{
            // ...
        }

        return Redirect::route('layers')->with('message','Layer Updated');
    }
}

更新

来自评论

admin/layers/%7Bid%7D/edit 实际上是 admin/layers/{id}/edit

看起来验证失败,它转到Redirect::route('edit-layer'),它缺少 id 参数

这样做:

return Redirect::route('edit-layer', array($id))->withErrors($validator)->with('message', 'Ups something happened');

关于php - 无法更新文件上传表单、laravel 表单绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27487127/

相关文章:

php - Laravel 5,Behat,Mink : base_url parameter is not read from behat. yml

database - Vue.js 和 Laravel 一次调用更新多行

angular - 无法下载由 barryvdh/laravel-snappy 创建的 PDF

php - Laravel Entrust,如何将现有权限附加到角色

reactjs - 在react-testing-library中按回车键提交表单不起作用

asp.net-mvc - 创建在运行时增长的动态表单

javascript - 提交页面时从 iframe 访问隐藏元素

php - preg_match数字和逗号

php - 为什么 php base64_decode 返回 null?

php - 将变量从 Controller 传递到 CodeIgniter 中的 View