Foros del Web » Programando para Internet » Jquery »

Enviar form ajax (post+files)

Estas en el tema de Enviar form ajax (post+files) en el foro de Jquery en Foros del Web. En el siguiente código cuanto me apoyo en AJAX los adjuntos no se envían, gracias Código HTML: <!-- http://www.miguelmanchego.com/2009/ajax-enviar-formularios-sin-recargar-jquery/ --> <!doctype html> <html lang= "es" ...
  #1 (permalink)  
Antiguo 16/10/2013, 05:47
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Enviar form ajax (post+files)

En el siguiente código cuanto me apoyo en AJAX los adjuntos no se envían, gracias

Código HTML:
<!--
http://www.miguelmanchego.com/2009/ajax-enviar-formularios-sin-recargar-jquery/
-->

<!doctype html>
<html lang="es">
<head>
	<meta charset="UTF-8">
	<title></title>
	<link rel="stylesheet" href="http://getbootstrap.com/dist/css/bootstrap.css">
	<link rel="stylesheet" href="http://getbootstrap.com/dist/css/bootstrap-theme.css">
	<script rel="stylesheet" href="http://getbootstrap.com/dist/js/vendor/bootstrap.js"></script>
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
	<script>window.jQuery || document.write('<script src="front/js/libs/jquery-1.8.2.min.js"><\/script>')</script>
	<style>
		body {
			margin: 50px 0;
		}
		[class^='col-sm'] {
			padding:0;
		}
		[class^='col-sm'] input {
			border-radius: 0;
		}
		.col-sm-12 textarea {
			border-radius: 0;
		}
		.col-sm-12 .input-group-addon {
			border-radius: 0 0 0 5px;
		}
		.col-sm-12 button, .col-sm-12 button:focus {
			border-radius: 0 0 5px 0;
			outline: 0;
		}
		.col-sm-4:nth-child(1) .input-group-addon {
			border-radius: 5px 0 0 0;
		}
		.col-sm-4:nth-child(3) input {
			border-radius: 0 5px 0 0;
		}
	</style>
</head>
<body>
	<div class="container">
		<?php require'vendor/autoload.php';
		use Valitron\Validator as V;
		//V::langDir(); // ajuste siempre langDir antes lang.
		V::lang('es');

		if (!extract($_POST)){ ?>
			<form method="post" enctype="multipart/form-data">
				<div class="row">
					<div class="col-sm-4">
						<div class="input-group">
							<span class="input-group-addon">
								<span class="glyphicon glyphicon-user"></span>
							</span>
							<input class="form-control" placeholder="Nombre:" name="nombre" value="nombre">
						</div>					
					</div>
					<div class="col-sm-4">
						<div class="input-group">
							<span class="input-group-addon" style="border-radius:0;">
								<span class="glyphicon glyphicon-envelope"></span>
							</span>
							<input class="form-control" placeholder="Email:" name="email" value="[email protected]">
						</div>
					</div>
					<div class="col-sm-4">
						<div class="input-group">
							<span class="input-group-addon" style="border-radius:0;">
								<span class="glyphicon glyphicon-font"></span>
							</span>
							<input class="form-control" placeholder="Asunto:" name="asunto" value="asunto">
						</div>
					</div>
				</div>
				<div class="row">
					<div class="col-sm-12">
						<div class="input-group">
							<span class="input-group-addon" style="border-radius:0;">
								<span class="glyphicon glyphicon-pencil"></span>
							</span>
							<textarea class="form-control" style="resize:none" placeholder="Mensaje:" name="mensaje">Mensaje</textarea>
						</div>
					</div>
				</div>
				<div class="row">
					<div class="col-sm-12">
						<div class="input-group col-sm-12	" style="padding:0;">
					<div class="prettyFile" style="padding:0;">
				<!-- -------------------------------------------------- -->
						<input type="file" name="archivo[]" multiple style="display:none;">
				<!-- -------------------------------------------------- -->
						<div class="input-group">
							<span class="input-group-addon">
								<span class="glyphicon glyphicon-paperclip"></span>
							</span>
							<input type="text" class="form-control" style="border-radius:0;" placeholder="Adjuntos:" name="Num_Adjuntos" title="Adjuntos">
							<span class="input-group-btn">
								<button class="btn btn-default" type="button" style="border-bottom-right-radius:0; width:80px;">Adjuntar</button>
							</span>
						</div>
				<!-- -------------------------------------------------- -->
					</div>
							<span class="input-group-btn">
								<button class="btn btn-default" type="reset">Borrar</button>
								<button class="btn btn-default" type="submit">Enviar</button>
							</span>
						</div><!-- /input-group -->
					</div>
				</div>
					<br>
			</form>
			<div id="result"></div>
		<?php }else{

			$validacion = new Valitron\Validator($_POST);
			$validacion->rule('required',['nombre','email','asunto','mensaje']);
			$validacion->rule('alpha','nombre');
			$validacion->rule('email','email');
			$validacion->rule('alphaNum','asunto');
			$validacion->rule('alphaNum','mensaje');
			
			if($validacion->validate()) {
				//echo "<br>Formulario cubierto correctamente. ";
				//echo"<br>";print_r($validacion->data());
				print_r($_FILES['archivo']);
			} else {
				$errors = $validacion->errors();
				//echo "<pre>";print_r($errors);echo "</pre>";
				
				echo "<div class='alert alert-warning' style='margin:0 auto;'>";
				echo "<a class='close' data-dismiss='alert' href='#' aria-hidden='true'>&times;</a>";
				if (!empty($errors['nombre'][0])) echo $errors['nombre'][0].'<br>';
				if (!empty($errors['email'][0])) echo $errors['email'][0].'<br>';
				if (!empty($errors['asunto'][0])) echo $errors['asunto'][0].'<br>';
				if (!empty($errors['mensaje'][0])) echo $errors['mensaje'][0].'<br>';
				echo "</div>";
			}


			//require 'class.phpmailer.php';//Lo primero es incluir la clase en vuestro php
			//require 'class.smtp.php';
			$mail = new PHPMailer();//Instanciamos un objeto de la clase phpmailer
			$mail -> PluginDir = "";//Indicamos a la clase phpmailer donde se encuentra la clase smtp
			$mail -> Mailer = "smtp";//Indicamos que vamos a conectar por smtp
			$mail -> Host = "ssl://smtp.gmail.com";//Servidor smtp de gmail. Como ves usamos cifrado ssl
			$mail -> Port = "465";//Puerto de gmail 465
			$mail -> SMTPAuth = true;// Enable SMTP authentication

			//Le indicamos que el servidor smtp requiere autenticación
			$mail -> Username = '[email protected]';// SMTP username
			$mail -> Password = 'contrasena';// SMTP password
			$mail -> SMTPSecure = 'ssl';// Enable encryption, 'ssl' also accepted

			$mail -> From = $email;
			$mail -> FromName = 'Quico';

			$mail -> addAddress($email, $nombre);// Añadir más destinatarios
			//$mail -> addAddress('[email protected]', 'Quico');// Añadir más destinatarios
			$mail -> addReplyTo('[email protected]', 'Quico');//Añadir dirección de respuesta
			$mail -> Subject = $asunto;// Asunto, cuerpo del mensaje y cuerpo plano sin formato
			$mail -> Body = $mensaje;//puede incluir html, podéis cogerlo de un form...

			function diverse_array($vector) {
				$result = array();
				foreach ($vector as $key1 => $value1) {
					foreach ($value1 as $key2 => $value2) {
						$result[$key2][$key1] = $value2;
						//$mail->addAttachment($result);
					}
				}
				return $result;
			}

			if(isset($_FILES['archivo'])){
				$archivos[]=diverse_array($_FILES['archivo']); {
				//echo "<br><pre>";
				//print_r($archivos);
				//echo "</pre><br>";
				foreach($archivos[0] as $valor)
					$mail->addAttachment($valor['tmp_name'],$valor['name']);
				}
			}

			//if (!$validacion->errors()) echo "s"; else echo "n";
			
			if (!$validacion->errors()) {
				/*
				if (!$mail -> send()) {
					echo 'No se pudo mandar el mensaje. ';
					echo 'Mailer Error: ' . $mail -> ErrorInfo;
					//exit;
				} else {
					echo "<div class='alert alert-success'>";
					echo "<a class='close' data-dismiss='alert' href='#' aria-hidden='true'>&times;</a>";
					echo 'El mensaje ha sido enviado correctamente.';
					echo "</div>";
				}
				*/
			}
			
		} ?>
	</div>
	<script type="text/javascript">
		// Pretty file
		if ($('.prettyFile').length) {
				$('.prettyFile').each(function() {
						var pF          = $(this),
								fileInput   = pF.find('input[type="file"]');
		 
						fileInput.change(function() {
								// When original file input changes, get its value, show it in the fake input
								var files = fileInput[0].files,
										info  = '';
								if (files.length > 1) {
										// Display number of selected files instead of filenames
										info     = files.length + ' files selected';
								} else {
										// Display filename (without fake path)
										var path = fileInput.val().split('\\');
										info     = path[path.length - 1];
								}
		 
								pF.find('.input-group input').val(info);
						});
		 
						pF.find('.input-group').click(function(e) {
								e.preventDefault();
								// Make as the real input was clicked
								fileInput.click();
						})
				});
		}
	</script>
	<script language="javascript">
		$(document).ready(function() {
		   // Esta primera parte crea un loader no es necesaria
		    $().ajaxStart(function() {
		        $('#loading').show();
		        $('#result').hide();
		    }).ajaxStop(function() {
		        $('#loading').hide();
		        $('#result').fadeIn('slow');
		    });
		   // Interceptamos el evento submit
		    $('form').submit(function() {
		  // Enviamos el formulario usando AJAX
		        $.ajax({
		            type: 'POST',
		            url: $(this).attr('action'),
		            data: $(this).serialize(),
		            // Mostramos un mensaje con la respuesta de PHP
		            success: function(data) {
		                $('#result').html(data);
		            }
		        })        
		        return false;
		    }); 
		})  
	</script>
</body>
</html> 
  #2 (permalink)  
Antiguo 17/10/2013, 09:54
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Enviar form ajax (post+files)

Solamente con AJAX NO puedes enviar archivos dinamicamente, para este caso usa este plugin que es muy útil y te ayudará con tu cometido.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 17/10/2013, 10:23
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Enviar form ajax (post+files)

Código Javascript:
Ver original
  1. $.ajax({
  2. type: 'POST',
  3. contentType: 'application/form-data; charset=UTF-8'
  4. });

Con eso debería funcionar.

Saludos
  #4 (permalink)  
Antiguo 17/10/2013, 10:30
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Enviar form ajax (post+files)

Has probado y que te funcione? se puede enviar con formData pero esta funcionalidad usa XMLHttpRequest 2 y el problema es que no hay todavía buen soporte (75%)

Por ello el plugin.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 17/10/2013, 10:34
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Enviar form ajax (post+files)

Cita:
Iniciado por jonni09lo Ver Mensaje
Has probado y que te funcione? se puede enviar con formData pero esta funcionalidad usa XMLHttpRequest 2 y el problema es que no hay todavía buen soporte (75%)

Por ello el plugin.

Saludos

Cierto, es una petición demasiado larga y no se puede hacer asincrónicamente.
Habría que utilizar la técnica del iframe o el framework que has mencionado.

Estaba casi seguro de haberlo hecho así

Etiquetas: ajax, form
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:33.