dropzone, использующий форму в laravel

#php #mysql #laravel #forms #dropzone

#php #mysql #laravel #формы #dropzone

Вопрос:

Я добавил dropzone в форму в laravel, и каждый раз, когда я добавляю изображения, форма немедленно отправляется без моего нажатия на кнопку отправки. Пожалуйста, обратитесь к следующим кодам:

Вот коды из компонента dropzone vue

 <template>
<div class="container" ref="imageUpload">
    <div class="row justify-content-center mb-3">
        <div class="col-12 bg-dark text-white rounded py-3 my-2 text-center">
            DROP IMAGE(S) HERE
        </div>
    </div>
</div>

</template>

<script>
    import Dropzone from 'dropzone';

    export default {
        data: function () {
            return{
                dropzone: null
            }
        },

        mounted() {
            this.dropzone = new Dropzone(this.$refs.imageUpload, {
                url: '/blog'
            });
        }
    }
</script>
  

Вот коды из BlogsController.php:

     public function store(Request $request)
{
    if(! is_dir(public_path('blog_images'))){
        mkdir(public_path('/blog_images'), 0777);
    }
    $blogimages = Collection::wrap( request()->file('file'));

    $blogimages->each(function($blogimage){
        $basename = Str::random();
        $original = $basename . '.'. $blogimage->getClientOriginalExtension();

        $blogimage->move(public_path('/blog_images'), $original);

        Blog::create([
            'original' => '/blog_images/' . $original,
        ]);

    });
    $blog = Blog::create($this->validateRequest());

    return view('blog.index');
}


public function validateRequest()
{
    return request()->validate([
        'title' => 'required',
        'caption' => 'required',
    ]);
}
  

Вот коды из create.blade.php которая содержит форму:

 <div class="container mt-5 blog-body">
<form action="/blog" method="POST" enctype="multipart/form-data">

    <div class="form-group row">
        <label for="title" class="col-4 col-form-label">Blog Title</label>
        <div class="col-8">
            <input id="title" type="text" class="form-control @error('title') is-invalid @enderror" name="title"
                value="{{old('title') }}" autocomplete="title" placeholder="Title">
            <div class="text-danger">{{ $errors->first('title') }}</div>
        </div>
    </div>

    <div class="form-group row">
        <label for="caption" class="col-4 col-form-label">Blog Caption</label>
        <div class="col-8">
            <input id="caption" type="text" class="form-control @error('caption') is-invalid @enderror" name="caption"
                value="{{old('caption') }}" autocomplete="caption" placeholder="caption">
            <div class="text-danger">{{ $errors->first('caption') }}</div>
        </div>
    </div>

    <div class="form-group row">
        <label class="col-4 col-form-label">Blog Images</label>
        <div class="col-8" id="app">
            <dropzone-component></dropzone-component>
        </div>
    </div>

        <button type="submit" class="btn btn-primary"> Post Blog</button>
@csrf
</form>
  

Вот коды из web.php файл:

 Route::resource('blog', 'BlogsController');
  

Вот коды из create_blogs_table.php

 Schema::create('blogs', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('original');
        $table->string('title');
        $table->string('caption');
    });
  

Ответ №1:

Вы можете задать параметры:

 autoProcessQueue: false
parallelUploads: 10 
  

Таким образом, dropzone загружается не сразу.

Комментарии:

1. Спасибо, что это действительно сработало, но появилась другая проблема. Ошибка заключается в: SQLSTATE[HY000]: General error: 1364 Field 'title' doesn't have a default value

2. Вы сохраняете блог без плитки в своем контроллере с помощью create. Вы можете либо добавить заголовок туда, либо изменить заголовок -> nullable() при переносе.