Estoy usando jQuery y Ajax para mis formularios para enviar datos y archivos, pero no estoy seguro de cómo enviar datos y archivos en un formulario.
Actualmente hago casi lo mismo con ambos métodos, pero la forma en que se recopilan los datos en una matriz es diferente, los datos se usan .serialize();
pero los archivos usan= new FormData($(this)[0]);
¿Es posible combinar ambos métodos para poder cargar archivos y datos de una forma a través de Ajax?
Datos jQuery, Ajax y html
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Archivos jQuery, Ajax y html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
¿Cómo puedo combinar lo anterior para poder enviar datos y archivos de una forma a través de Ajax?
Mi objetivo es poder enviar todo este formulario en una publicación con Ajax, ¿es posible?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
javascript
jquery
ajax
forms
Dan
fuente
fuente
FormData
enfoque debería funcionar bien con formularios que contienen lo que desee, no solo los campos de carga de archivos; Sin embargo, no es ampliamente compatible.FormData
Respuestas:
El problema que tuve fue usar el identificador de jQuery incorrecto.
Puede cargar datos y archivos con un formulario usando ajax .
PHP + HTML
jQuery + Ajax
Version corta
fuente
$(this)[0]
es solo un alias dethis
, por lo quenew FormData(this)
debería ser suficiente.async: false
no parece necesaria para que esto funcione y causa el bloqueo de los navegadores (sola) roscados móvilesOtra opción es utilizar un iframe y establecer el objetivo del formulario.
puedes probar esto (usa jQuery):
funciona bien con todos los navegadores, no necesita serializar o preparar los datos. Una desventaja es que no puedes monitorear el progreso.
Además, al menos para Chrome, la solicitud no aparecerá en la pestaña "xhr" de las herramientas del desarrollador, sino en "doc"
fuente
Estaba teniendo este mismo problema en ASP.Net MVC con HttpPostedFilebase y, en lugar de usar el formulario en Enviar, necesitaba usar el botón al hacer clic donde necesitaba hacer algunas cosas y luego, si todo está bien, envíe el formulario, así es como lo hice funcionar
esto rellenará correctamente su modelo MVC, asegúrese de que en su Modelo, La propiedad para HttpPostedFileBase [] tenga el mismo nombre que el Nombre del control de entrada en html, es decir
fuente
contentType : "application/octet-stream"
O más corto:
fuente
Para mí, no funcionó sin
enctype: 'multipart/form-data'
campo en la solicitud de Ajax. Espero que ayude a alguien que está atrapado en un problema similar.Aunque
enctype
ya estaba configurado en el atributo de formulario , por alguna razón, la solicitud de Ajax no identificó automáticamente laenctype
declaración sin explícita (jQuery 3.3.1).Como otros mencionados anteriormente, preste especial atención a los campos
contentType
yprocessData
.fuente
enctype
no se menciona en absoluto.enctype
campo no está cubierto en la documentación por una razón. No he verificado el código fuente de jQuery, así que no puedo decir con certeza.enctype
campo y ya no carga archivos (devuelve el error de tipo de codificación). No estoy seguro de cómo funciona, ya que no he comprobado el código fuente de jQuery. Publiqué esta respuesta con la intención de ayudar a otros que están atrapados en un problema similar. No estoy buscando votos a favor aquí ... Si tiene más preguntas / comentarios, hablemos en lugar de comentar.Para mí siguiendo el código de trabajo
En su Método de publicación de acciones, pase el parámetro como HttpPostedFileBase UploadFile y asegúrese de que la entrada de su archivo tenga la misma que se menciona en su parámetro del Método de acción. También debería funcionar con el formulario AJAX Begin.
Recuerde aquí que su Formulario AJAX BEGIN no funcionará aquí ya que realiza su llamada posterior definida en el código mencionado anteriormente y puede hacer referencia a su método en el código según el Requisito
Sé que estoy respondiendo tarde, pero esto es lo que funcionó para mí.
fuente
Una manera simple pero más efectiva:
new FormData()
es en sí misma como un contenedor (o una bolsa). Puede poner todo el atributo o archivo en sí mismo. Lo único que necesitará para agregar,attribute, file, fileName
por ejemplo:y solo pásalo en la solicitud AJAX. P.ej:
Puede agregar n número de archivos o datos con FormData.
y si está haciendo una solicitud AJAX desde el archivo Script.js al archivo de ruta en Node.js, tenga cuidado de usar
req.body
para acceder a los datos (es decir, texto)req.files
para acceder al archivo (es decir, imagen, video, etc.)fuente
En mi caso, tuve que hacer una solicitud POST, que tenía información enviada a través del encabezado, y también un archivo enviado usando un objeto FormData.
Lo hice funcionar usando una combinación de algunas de las respuestas aquí, así que básicamente lo que terminó funcionando fue tener estas cinco líneas en mi solicitud de Ajax:
Donde formData era una variable creada así:
fuente
contentType: "application/octet-stream",
es activamente dañino y la única razón por la que no causa un problema es porque lo sobrescribe dos líneas más tarde.enctype: 'multipart/form-data',
no tiene sentido jQuery.ajax no reconoce ese parámetro.///// otherpage.php
fuente