archivos de input file a través de ajax

DaRkViRuZ

como podría hacer para que mi función de jquery recoja el archivo o archivos que ha seleccionado el usuario en un input file y enviarlos a través de un $.post ? para luego tratarlos en un php ?

ejemplo:

HTML
JQUERY
PHP

estoy teniendo problemas a la hora de mandarlo por ajax, es esto posible o me estoy colando en algún lado ?

spoiler
cabron

Ni puta idea de jquery, pero en javascript nativo necesitas leer el archivo con un FileReader, no te vale tratarlo como un campo normal de un formulario, ¿no será algo parecido en jquery?

willy_chaos

Te dejo codigo que hice yo en su momento desde JS

El codigo obtiene el fichero de un campo, y lo sube via AJAX al servidor. Este lo guarda en las carpetas de ficheros, le asigna una id, guarda en la db y posteriormente contesta con la ruta en el servidor del fichero y el nombre.


var hihaError = false;
var errorMsg = "ERROR: \n";
var serieAlu = $("#serie").val();
var seriePre = $("#cf_serie").val();
var filename = $("#mod_file_b2").val();	
var filedata = $("#mod_file_b2").prop('files')[0];
var urlFRM = $("#urlAJAX").val();
$("#ajaxform_message_b2").html("<img src='../images/loading.gif' style='width:16px; title='Processant dades'>");
		var data = new FormData();	
		data.append('serieAlu',serieAlu);
		data.append('seriePre',seriePre);
		data.append('filename',filename);
		data.append('filedata',filedata);
		
	jQuery.ajax({
		url: urlFRM+"?/aplicacio=410&/tipus_plana=1000",
		type: 'POST',
		data: data,
		cache: false,
		processData: false,
		contentType: false,
		success: function (result) {
			var respuestaParseada = jQuery.parseJSON(result);
			if ( respuestaParseada["response"] == "OK" ) {
				if ( $("#spanDownloadB2File").html().trim() != 0 ) {
					// Existe el boton, entonces cambiamos el download attr
					$("#viewfile_b2").attr('onclick','descarrega("'+respuestaParseada["nomfitxer_b2"]+'");');
				} else {
					// Creamos el boton
					$("#spanDownloadB2File").html("<input type='button' id='viewfile_b2' class='Boton' value='Veure Fitxer' onclick='javascript:descarrega(\""+respuestaParseada["nomfitxer_b2"]+"\")'>");
				}	
				$("#flag_b2").prop('checked', true);
				$("#ajaxform_message_b2").html("<img src='../images/valid.png' style='width:16px;'>");
				$("#ajaxform_file_b2").delay(1500).fadeOut('slow');
				
			} else {
				$("#ajaxform_message_b2").html("<img src='../images/error.png' style='width:16px;'> "+respuestaParseada["message"]);
			}
		},
		error: function () {
			$("#ajaxform_message_b2").html("<img src='../images/error.png' style='width:16px;'> <span style=''>Error al pujar el fitxer</span>");
		}
	});
1 respuesta
DaRkViRuZ

#3 le engancho el archivo al formdata pero luego en el php me dice undefined index :S

1 respuesta
willy_chaos

#4 Perdon no habia puesto como he recuperado los campos en el JS. Luego tambien te pongo aquí como lo recupero en el Backend, aunque en este caso es Java :/

MultipartRequest mpRequest = new MultipartRequest();
		mpRequest.setRequest(req);
		String seriePre = (String) mpRequest.getParameter("seriePre");	
		String serieAlu = (String) mpRequest.getParameter("serieAlu");	
		String filename = (String) mpRequest.getParameter("filename");	
		MultipartRequest.File file = mpRequest.getFileParameter("filedata");
1 respuesta
DaRkViRuZ

#5 con un $_POST['archivo'] debería funcionar

si yo le pongo al formData
datos.append("archivo",$("#subir-foto").prop('files')[0]);

y luego intento recuperarlo en el php me dice que no esta definido "archivo", en cambio si pongo
datos.append("archivo","hola");

si que me lo recupera :S porque ? no entiendo nada

si hago un alert en el cliente antes de enviarlo con
alert($("#subir-foto").prop('files')[0]));
me dice que tengo un objeto File asi que lo coge bien

FALLO MIO, tengo que recuperarlo con $FILES no con $POST

1

Usuarios habituales

  • DaRkViRuZ
  • willy_chaos
  • cabron