【问题标题】:Laravel - Upload to Existing Model RecordLaravel - 上传到现有模型记录
【发布时间】:2018-05-28 18:34:19
【问题描述】:

也许是因为我累了,但我似乎无法为我的一个模型进行简单的上传。

在我的客户(不是用户)模型的显示详细信息页面上,我有一个简单的表单,用户可以在其中上传客户的徽标。

形式:

<form enctype="multipart/form-data" action="/customers/i/{{$customer->url_string}}" method="POST">
    <input type="file" name="logoUpload">
    <input type="hidden" name="_token" value="{{csrf_token()}}">
    <input type="submit" class="pull-right btn btn-sm btn-primary" value="Upload">
</form>

控制器:

public function logoUpload(Request $request){
    if($request->hasFile('logoUpload')){
        $path = Storage::putFile('public/customer/uploads', new File(request('logoUpload')));

        $customer->car_logo = $path;
        $customer->save();

        return back();
    }   
}

我知道问题是我没有在控制器中定义 $customer,因为在我单击提交后文件确实将自身存储在正确的文件夹中,但它根本没有访问数据库。

更新

当前客户详情网址:

http://localhost:8000/customers/i/dsdado9a98w78721

post 路由的 web 定义:

Route::post('/customers/i/{customer}', 'CustomerController@logoUpload');

【问题讨论】:

  • 你能显示你的路线定义和你正在点击的当前网址吗?
  • 是的,我已经更新了我的问题。
  • 路由参数引用Customer 上的哪个字段?
  • {customer} 在我的客户表中引用了一个名为 url_string 的字段

标签: laravel laravel-5 file-upload controller upload


【解决方案1】:

您有一些选择,这是一个简单的选择,只需调整该控制器方法:

public function logoUpload(Request $request, $customer)
{
    $customer = Customer::where('url_string', $customer)->firstOrFail();

    if($request->hasFile('logoUpload')){
        $path = Storage::putFile('public/customer/uploads', new File(request('logoUpload')));

        $customer->car_logo = $path;
        $customer->save();

        return back();
    }
    ...
}

我们在方法签名中添加了一个参数来接受路由参数。然后我们通过url_string找到与该参数匹配的模型。

您还可以设置路由模型绑定,以根据您的路由参数解析该模型。

【讨论】:

    【解决方案2】:

    您必须在您的表单中创建一个包含客户 ID 的隐藏字段,然后在您的控制器中使用它来使用新的文件路径更新它,这是一个示例:

    查看

    <form enctype="multipart/form-data" action="/customers/i/{{$customer->url_string}}" method="POST">
        <input type="file" name="logoUpload">
        <input type="hidden" name="_token" value="{{csrf_token()}}">
        <!-- customer_id field -->
        <input type="hidden" name="customer_id" value="{{$customer->id}}">
        <input type="submit" class="pull-right btn btn-sm btn-primary" value="Upload">
    </form>
    

    控制器

    public function logoUpload(Request $request){
        if($request->hasFile('logoUpload')){
            $path = Storage::putFile('public/customer/uploads', new File(request('logoUpload')));
    
            // get customer
            $customer = Customer::find($request->customer_id);
    
            $customer->car_logo = $path;
            $customer->save();
    
            return back();
        }   
    }
    

    【讨论】:

    • 他们正在为他们想要的“标识符”使用路由参数...... URL 本身标识了客户
    • 我不认为 url_string 是标识符,但是使用客户 ID 会很快,因为它已经是索引字段
    • 也许他们不想暴露 id,他们似乎有目的地使用 url_string 作为 URL 中的路由参数,他们可以很容易地使用 id ...人们也使用'slugs' 作为标识符,它们不是自动增量 ID :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2017-07-04
    • 2016-08-10
    • 2017-11-10
    • 1970-01-01
    • 2021-09-19
    • 2011-06-23
    相关资源
    最近更新 更多