【问题标题】:laravel 6 : Call to a member function store() on nulllaravel 6:在 null 上调用成员函数 store()
【发布时间】:2020-10-14 06:25:34
【问题描述】:

我正在尝试将文件附加到博客类型的帖子。为此,我有一个文件字段和 2 个按钮,一个将字段保存到数据库,另一个上传文件。独立文件上传按预期工作。然而,在表单中,我得到 在 null 上调用成员函数 store()。我已将方法从 put 更改为 post,但这似乎没有任何效果。

在我的帖子表单和控制器中的功能下方。

形式:

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">New/Edit Blog</div>
                <div class="card-body">
                   @if($data)
                <form … action = "{{Route ('post.update', $data->_id)}}" method="post", enctype = 'multipart/data'>
                    @csrf
                    @method('POST')
                    <div class="form-group">
                        <label for="usr">Title:</label>
                        <input type="text" class="form-control" name="title" value = "{{$data->title}}" >
                      </div>

                      <div class="form-group">
                        <label for="shorttext">Shorttext:</label>
                        <input type="text" class="form-control" name="shorttext" value = "{{$data->shorttext}}" >
                      </div>

                          <div>
                          <input id="x" type="hidden" name="content" value ="{{$data->content}}">
                          <trix-editor input="x" ></trix-editor>
                        </div>
                 
                    
                    <div class="form-group">
                        <label for="created_by">Created By:</label>
                        <input type="text" class="form-control" name="created_by" value = "{{$data->created_by}}" readonly>
                      </div>
                     
                      <input type="file" name="attachment" enctype="multipart/form-data"/>
                    <p align="center">
                      <input type="submit" btn btn-primary class="btn btn-primary" id="save" name="action" value="save">
                   
                      <input type="submit" btn btn-primary class="btn btn-primary" id="upload" name="action" value="upload">

控制器中的功能:

Store:(这个是决定按下哪个按钮的函数)

public function store(Request $request, $_id = false, $attachment = false){
        //check which submit was clicked on
        if($request->action == 'upload'){
            //
            $this->upload($request);
            return redirect()->route('home');
        } elseif($request->action == 'save') {
            //echo 'save pressed';
            //run function save all form fields
           
            $this->update($request, $_id);
            return redirect()->route('home');

         } else {echo "error";}
   }

上传功能:

function upload(Request $request){

        $path = $request->file('attachment');
       // $original = $request->file('attachment')->getClientOriginalName();
        
        $path->store('/public');

更新功能:

public function update (Request $request,  $_id){
        
        //$this->upload($request);
/* 
        $path = $request->file('attachment');
        $path->storeas('/public','123'); */
        
        $data = post::findOrFail($_id);

        $data->title    = $request->title;
        $data->content  = $request->content;
        $data->shorttext  = $request->shorttext;
        $data->created_by  = $request->created_by;
        $data->text3  = $request->text3;
        $data->attachment  = $request->attachment;
       
        $data->save();

    
        if($data){
            return redirect()->route('home');
    
        }else{
            return back();
            }
        }

路线是:

Route::post('/post/update/{_id}', 'PostController@store')->name('post.update');

如前所述,完整表单中的保存功能有效。在独立形式(和独立控制器)中,上传工作(如果我愿意,我可以操纵文件名),但我如何将 2 结合在一起?起初我以为是因为更新表单有一个 PUT 方法,但是将所有内容更改为 post 似乎没有任何效果,我仍然收到 Null 错误。

为了完整起见,独立解决方案:

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Te7aHoudini\LaravelTrix\Pipes\AttachmentInput;

class UploadController extends Controller
{
    //
    function upload(Request $req){

$path = $req->file('attachment');
$original = $req->file('attachment')->getClientOriginalName();

$path->storeas('/public',$original);
echo $original;

       
    }

}

独立形式:

<html>
<head>
    <title>Upload</title>
</head>
</html>
<form action="upload" method="POST" enctype="multipart/form-data">
<input type="file" name="attachment" />
@csrf

<button type="submit">file upload</button>
</form>

【问题讨论】:

    标签: laravel file-upload upload


    【解决方案1】:

    在您的form 元素中将enctype = 'multipart/data' 更改为enctype="multipart/form-data"

    <form … action = "{{ Route ('post.update', $data->_id) }}" method="post", enctype="multipart/form-data">
    

    希望这能解决您的问题。

    【讨论】:

    • 谢谢!!这当然有效,文件现在上传,将 2 个功能置于 1 个按钮下很容易,将文件名存储在数据库中也是如此。它就在我面前,我一定看过那条线1000次
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2020-10-28
    • 2021-04-25
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多