Функция getClientOriginalName () в null Laravel - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь использовать Dropzone в своем французском laravel приложении (последняя версия). Когда я сохраняю свою форму, я получаю сообщение об ошибке

Вызов функции-члена getClientOriginalName () для null Я пытаюсь посмотрим, отправил ли мой запрос что-то с помощью dd (), но я получаю значение null

Это моя функция на контроллере

public function enregistrer(Request  $request){
        $photo = $request->file('file');
        $imageName = $photo->getClientOriginalName();
        $image->move(public_path('images'),$imageName);

        $demande = new Demande();
        $demande->filename = $imageName;
        $demande->cin= $request('cin');
        $demande->apoge=$request('apoge');
        $demande->generatedCode= uniqid();
        $demande->save();

        return  redirect('/demande');

    }

И это мое мнение

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <!-- All for dropzone -->
        <meta name="_token" content="{{csrf_token()}}" />
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.4.0/min/dropzone.min.css">

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.4.0/dropzone.js"></script>

        <title>Submission E-Docs</title>

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">

        <!-- Styles -->
        <style>
            html, body {
                background-color: #fff;
                color: #636b6f;
                font-family: 'Nunito', sans-serif;
                font-weight: 200;
                height: 100vh;
                margin: 0;
            }

            .full-height {
                height: 100vh;
            }

            .flex-center {
                align-items: center;
                display: flex;
                justify-content: center;
            }

            .position-ref {
                position: relative;
            }

            .top-right {
                position: absolute;
                right: 10px;
                top: 18px;
            }

            .content {
                text-align: center;
            }

            .title {
                font-size: 84px;
            }

            .links > a {
                color: #636b6f;
                padding: 0 25px;
                font-size: 13px;
                font-weight: 600;
                letter-spacing: .1rem;
                text-decoration: none;
                text-transform: uppercase;
            }

            .m-b-md {
                margin-bottom: 30px;
            }
        </style>
    </head>
    <body>
        <div class="flex-center position-ref full-height">
            @if (Route::has('login'))
                <div class="top-right links">
                    @auth
                        <a href="{{ url('/home') }}">Home</a>
                    @else
                        <a href="{{ route('login') }}">Login</a>

                        @if (Route::has('register'))
                            <a href="{{ route('register') }}">Register</a>
                        @endif
                    @endauth
                </div>
            @endif

            <div class="content">
                <form role="form" action="{{url('demande/store')}}" method="POST" enctype="multipart/form-data" class="dropzone" id="dropzone">
                @csrf
                <label> Votre CIN:</label>
                <input type="text" name="cin"/>
                <label> Votre Apogée:</label>
                <input type="text" name="apoge"/>

                <!-- <input name="file" type="file" multiple /> -->


                <br>
                <input type="submit" class="btn btn-outline-primary btn-lx"  style="font-family:'Quicksand', sans-serif; font-size:20px "value="Créer">

                </form>

            </div>
        </div>


        <script type="text/javascript">
            Dropzone.options.dropzone =
            {
                maxFilesize: 10,
                renameFile: function (file) {
                    var dt = new Date();
                    var time = dt.getTime();
                    return time + file.name;
                },
                acceptedFiles: ".jpeg,.jpg,.png,.gif",
                addRemoveLinks: true,
                timeout: 60000,
                success: function (file, response) {
                    console.log(response);
                },
                error: function (file, response) {
                    return false;
                }
            };
        </script>
    </body>
</html>

Я думал, что это из-за

1 Ответ

0 голосов
/ 25 января 2020

Вы переименовываете выбранный пользователем файл dropbox JS перед отправкой его на сервер

 renameFile: function (file) {
                var dt = new Date();
                var time = dt.getTime();
                return time + file.name; //<-- gets a unique name
            },

Это имя динамически c и не может быть предсказано на контроллере, но в используемом контроллере

  $photo = $request->file('file');

Очевидно, что это не получится, поскольку имя может быть любым, основываясь на времени его отправки. Итак, первый вариант - удалить renameFile, но если это невозможно, вам нужно каким-то образом получить доступ к файлу, не зная имени, которое было загружено как

Попробуйте это

//$photo = $request->file('file');
$fileBag = $data->files; //Symfony\Component\HttpFoundation\FileBag
$collFile = $fileBag->all(); //an array of Symfony\Component\HttpFoundation\File\UploadedFile

if(count($collFile)){
    $photo = $collFile[0];
    //.. other code
}
else{
    echo 'No file was uploaded';
}

Это в основном пытается получить все файлы из FileBag в массив, а затем пытается выбрать первый из него.

...