Как разрешить formData отправляет ноль - PullRequest
1 голос
/ 07 января 2020

У меня есть форма, она отлично работает, если я заполняю все поля, но если я не заполняю поле вложения, возвращается ошибка: The attachment must be a file of type: image/jpeg, image/png., в то время как мое вложение nullable в бэкэнд-валидаторе.

код

backend

public function sendEmail(Request $request) {
    $this->validate($request, array(
        'body'  => 'required',
        'subject'  => 'required',
        'receivers'  => 'required',
        'project_id' => 'required',
        'attachment' => 'nullable|mimetypes:image/jpeg,image/png|max:2048',
    ));

    if ($request->hasFile('attachment')) {
        $request->validate([
            'attachment' => 'nullable|mimetypes:image/jpeg,image/png|max:2048',
        ]);
        $image = $request->file('attachment');

        $filename = 'attachment-' . str_random(10) . '-' . time() . '.' . $image->getClientOriginalExtension();

        $location = public_path('images/'. $filename);
        // $request->file('photo')->move(public_path('images') . $filename);
        $request->file('attachment')->storeAs('attachment', $filename);
        $attachment = $filename;
    } else {
        $attachment = null;
    }
    //rest of function
}

Ajax

$('body').on('click','.sendMailNowSubmit',function(e) {
    e.preventDefault();
    $(this).text('Please wait ...');

    var formData = new FormData();
    formData.append('body', $('#messageBody').val());
    formData.append('subject', $('#messageSubject').val());
    formData.append('receivers', $('#receivers').val());
    formData.append('project_id', $(this).data('id'));
    formData.append('attachment', $('input[type=file]')[0].files[0]);

    $.ajax({
        type:'POST',
        url:'{{route('sendEmail')}}',
        data: formData,
        async: false,
        cache: false,
        contentType: false,
        dataType: 'JSON',
        enctype: 'multipart/form-data',
        processData: false,
        success:function(data){
            $(".sendMailNow").attr("disabled", false);
            document.getElementById("sendMailForm").reset();
            $(".Mailmessage").append('<div class="alert alert-success fade in">'+data.success+'</div>').hide(4000);
            $(".sendMailModal").modal('hide');
            $(".sendMailNowSubmit").val("Done!");
            $(".sendMailNowSubmit").text('Submit');

        },
        error: function(data){
            $(".sendMailNow").attr("disabled", false);
            var errors = data.responseJSON;
            errorsHtml = '<div class="alert alert-danger alert-dismissible"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><ul>';
            $.each(errors.errors,function (k,v) {
                    errorsHtml += '<li>'+ v + '</li>';
            });
            errorsHtml += '</ul></di>';
            $( '.Mailmessage' ).html( errorsHtml );
            $(".sendMailNowSubmit").text('Re-Submit');
        }
    });
});

Есть идеи?

1 Ответ

2 голосов
/ 07 января 2020

Попробуйте этот код для проверки

$rules = [
    'body'  => 'required',
    'subject'  => 'required',
    'receivers'  => 'required',
    'project_id' => 'required'
];
if ($request->hasFile('attachment')) {
   $rules['attachment'] = 'mimetypes:image/jpeg,image/png|max:2048';
}
 $this->validate($request, $rules);
...