es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviar objeto de datos AJAX personalizado desde un pseudformulario (div) dentro de un formulario.

Tengo un formulario de registro y quiero agregar una carga de archivo a mitad del proceso. Esto significa que el proceso de carga debe comportarse de manera diferente al formulario de registro. Sin embargo, tengo problemas para enviar los campos de datos personalizados (especialmente el campo FILES) al controlador de ajax.

<div class="doc_upload_area">
  <input type="hidden" name="propertyId" value="<?php echo $tempPropertyId; ?>">
  <div class="input-group">
    <input type="file" class="form-control file_upload" name="the_file" aria-label="Upload">
    <select required="" class="form-select document_id" name="document_type">
      <option value="">Dinos lo que estás subiendo</option>
      <option value="document">Documento</option>
      <option value="brochure">Folleto</option>
    </select>
    <button class="btn btn-outline-secondary doc_upload" type="submit">Subir</button>
  </div>
</div>

Aquí está la parte principal del código jQuery en cuestión. Como puede ver, he intentado serializar el div. Solo tengo dos campos que necesito pasar a los datos para enviarlos al controlador…

$(".doc_upload").on('click',(function(e) {
   var x = $(".doc_upload_area").serializeArray();
   e.preventDefault();
   $.ajax({
      url: "../document_upload.php",
      type: "POST",
      data:  x
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para incluir cargas de archivo en un formulario de registro utilizando Ajax, debes cambiar el comportamiento del proceso de carga para que se comporte de manera diferente al formulario de registro. Sin embargo, hay problemas al enviar campos de datos personalizados (específicamente el campo FILES) al controlador de Ajax.

    Para solucionar esto, no puedes usar la función serializeArray(). En su lugar, debes usar el objeto FormData para crear una instancia de FormData y agregar datos a ella. Luego, puedes agregar el archivo y los datos del formulario al mismo objeto antes de enviarlo al servidor utilizando la función $.ajax(). Aquí tienes un ejemplo de código:

    $($(".doc_upload")).on('click',(function(e) {
      e.preventDefault();
    
      // Crear nuevo objeto FormData
      var formData = new FormData();
    
      // Agregar datos del formulario
      var propertyId = $("input[name='propertyId']").val();
      var documentType = $(".document_id").val();
      formData.append('propertyId', propertyId);
      formData.append('documentType', documentType);
    
      // Agregar archivo
      var fileInput = $("input[type='file']");
      var file = fileInput[0].files[0];
      formData.append('file', file);
    
      // Enviar solicitud Ajax
      $.ajax({
        url: "../document_upload.php",
        type: "POST",
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
          // Manejar el éxito
        },
        error: function(jqXHR, textStatus, errorThrown) {
          // Manejar el error
        }
      });
    }));
    

    En este código, primero creamos un nuevo objeto FormData. Luego obtenemos los valores de los campos propertyId y documentType y los agregamos al objeto formData utilizando el método append().

    A continuación, obtenemos la entrada de archivo, obtenemos el primer archivo seleccionado y lo agregamos al objeto formData nuevamente utilizando el método append().

    Finalmente, enviamos la solicitud Ajax utilizando la función $.ajax(), pasando el objeto formData como parámetro de datos. También establecemos processData: false y contentType: false para asegurarnos de que jQuery no intente procesar los datos ni establecer el tipo de contenido por nosotros, respectivamente.

Comments are closed.