Проблемы с отправкой изображения из Ajax, FormData и получением с помощью PHP

#php #html #ajax #form-data

#php #HTML #ajax #форма-данные

Вопрос:

Помогите, попробуйте загрузить изображение из формы с помощью js, используя Ajax, FormData

МОДАЛЬНАЯ ФОРМА, ФОРМА, ИСПОЛЬЗУЕМАЯ ДЛЯ СБОРА ИНФОРМАЦИИ И ИЗОБРАЖЕНИЯ

             <div id="modal-editar" style="display: none">
                <form id="pais-editar" >
                    <div class="Listar-table">
                        <div class="Listar-table-dato">
                            <span class="">Nombre Empresa</span>
                        </div>
                        <div class="Listar-table-dato">
                            <span class="Forms-table">
                                <input type="text" name="conf[pais]" id="pais-ed" required="">
                            </span>
                        </div>
                    </div>
                    <div class="Listar-table">
                        <div class="Listar-table-dato">
                            <span class="">MONEDA (Abreviatura)</span>
                        </div>
                        <div class="Listar-table-dato">
                            <span class="Forms-table">
                                <input type="text" name="conf[moneda]" id="moneda-ed" required="">
                            </span>
                        </div>
                    </div>
                    <div class="Listar-table">
                        <div class="Listar-table-dato">
                            <span class="">Bandera</span>
                        </div>
                        <div class="Listar-table-dato">
                            <span class="Forms-table">
                            <input type="file"  name="bandera" accept="image/x-png,image/gif,image/jpeg" />
                            </span>
                        </div>
                    </div>
                    <div id="mensaje-editar">
                    </div>
                    <div class="Contendedor-filtro-der Contener-btn" style="text-align: center;">
                        <input type="submit" class="Btn-naranja-auto" name="" value="Guardar Pais">
                    </div>
                </form>
            </div> 

ФУНКЦИЯ JS, ЭТО БЕРЕТ ИНФОРМАЦИЮ ИЗ ФОРМЫ И ОТПРАВЛЯЕТ ЕЕ С ПОМОЩЬЮ AJAX

     $('body').on('submit', '#pais-editar', function(e) {
        e.preventDefault();
        $('#modal-editar').iziModal('startLoading');
        
        var data = new FormData();
        $.each($('#bandera'), function(i, obj) {
            $.each(obj.files, function(j, file) {
                data.append('bandera', file);
            });
        });
        otradata = $('#pais-editar').serializeArray();
        $.each(otradata, function(key, input) {
            data.append(input.name, input.value);
        });
        data.append('conf[id]', pais_id);
        data.append('conf[opc]', 'pais-editar');

        
        $.ajax({
            url: 'libs/ac_configuracion',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            dataType: 'json',
            success: function(data) {
                $('#modal-editar').iziModal('stopLoading');
                if (data.status == true) {
                    $('#modal-editar').iziModal('resetContent');
                    iziToast.success({
                        title: 'Correcto',
                        message: data.msg,
                        position: 'center',
                        overlay: true,
                        displayMode: 1,
                        target: '#mensaje-editar',
                        pauseOnHover: false
                    });
                    lista_paises(1);
                } else {
                    iziToast.error({
                        title: 'Error',
                        message: data.msg,
                        position: 'center',
                        overlay: true,
                        displayMode: 1,
                        target: '#mensaje-editar',
                        pauseOnHover: false
                    });
                }
            }

});

    }); 

и, наконец, это мой php-код, который получает данные, загружает изображение и редактирует информацию

 $codigo = explode('-', $data['id']);
  
    @$nombre_adjunto = $_FILES['bandera']['name'];
    @$tmp_adjunto    = $_FILES['bandera']['tmp_name'];
    $folder_gastos = '../banderas';

    $trozo1=explode(".", $nombre_adjunto);      
    $nombre_archivo= 'bandera_'.($data['pais']).'.'.end($trozo1);
    @$target_path = $folder_gastos.'/'.$nombre_archivo; //Indicamos la ruta de destino, así como el nombre del archivo
    move_uploaded_file($tmp_adjunto, $target_path);


    $dats = ['nombre_pa' => $data['pais'], 'moneda_pa' => $data['moneda'] , 'bandera' => $nombre_archivo];

 
   

    $nuevo = $db
        ->where('Id_pa', $codigo[1])
        ->update('paises', $dats);
    if ($nuevo) {
        $msg['status'] = true;
        $msg['msg']    = 'País Editado';
    } else {
        $msg['status'] = false;
        $msg['msg']    = 'No se ha podido editar el país';
    }

    echo json_encode($msg);
 

предполагается, что это работает, текстовая информация поступает, но изображение не

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

1. Что вам var_dump($_FILES); дает? Кроме того, при отладке кода удалите все @ перед вашими заявлениями (например @$nombre_adjunto = $_FILES['bandera']['name']; ), поскольку они подавляют сообщения об ошибках, что затрудняет отладку. Ошибки должны обрабатываться, а не просто подавляться. Проверьте, установлены ли они, используя isset() или аналогичные вместо этого.

2. Я также не вижу смысла перебирать $('#bandera') и файлы, когда есть только один элемент с этим идентификатором, и он содержит только один файл.