Subir imágenes a MySQL en Blob con AJAX

Aunque el método estándar para subir imágenes (y en general archivos) a un servidor es tan simple como (en resumen) subir el archivo y moverlo a una carpeta, existe la posibilidad de subir las imágenes a la base de datos (MySQL) a través de AJAX y alojarla en binario en un campo Blob (longblob, en este caso, con 2^32 – 1 caracteres, o sea, 4.294.967.295 caracteres) de la tabla en la BBDD.

En resumen, es algo así lo que vamos a hacer hoy:

Los parámetros de la petición al script en PHP son algo como esto:

Bien, comencemos.

¿Cómo enviar imágenes a MySQL?

Seguimos con el desarrollo en local: XAMPP (Apache y MySQL con PHPMyAdmin) en Windows.

1 de 6: HTML

En un archivo .php tenemos que agregar un formulario que acepte UTF-8, con método POST, y enctype “multipart/form-data”. Además, añadiremos un ID que, en mi caso, se llamará enviarimagenes.

Dentro de este formulario debe haber un input de tipo file, al cual le pondré de nombre imagen. Además, incluiré un input de tipo texto con el nombre titulo y un textarea con el nombre descripcion (los nombres sin tildes). Y obviamente un botón de submit.

Debajo del formulario pondremos un contenedor donde se mostrarán los mensajes correspondientes.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Subir imagen</title>
</head>

<body>
<form accept-charset="utf-8" method="POST" id="enviarimagenes" enctype="multipart/form-data" >
<label>Titulo</label><br>
<input type="text" name="titulo" />
<br><br>
<label>Descripcion</label><br>
<textarea name="descripcion"></textarea>
<br><br>
<input type="file" name="imagen"/>
<br><br>
<button type="submit">ENVIAR</button>
</form>

<hr>
<div id="mensaje"></div>
<hr>

</body>
</html>

En esta ocasión no le pondré límite de caracteres a las entradas de texto, para no complicar innecesariamente el script de PHP.

2 de 6: jQuery

A continuación hay que agregar la librería de jQuery en el head del HTML para poder usar la función AJAX. Yo utilizaré la versión 1.9.1 minificada que tengo descargada.

<script src="js/jquery-1.9.1.min.js"></script>

Después, encima de donde termina el BODY de HTML, debemos crear una función que compruebe si se ha enviado el formulario, y entonces obtenga los datos del mismo y los envíe a través de $.ajax. Para esto usaremos el objeto FormData.

En la función AJAX debemos especificar la URL del archivo que procesará los datos (en mi caso, el archivo se llama subir.php), asignarle un tipo POST, con dataType de tipo HTML, y cachecontentTypeprocessData en false. Además, usaremos el callback .done para mostrar el mensaje que corresponda (en base a la respuesta del script en PHP) en un contenedor (div).

Así que, debemos obtener algo como esto:

<script>
$("#enviarimagenes").on("submit", function(e){
	e.preventDefault();
	var formData = new FormData(document.getElementById("enviarimagenes"));

	$.ajax({
		url: "subir.php",
		type: "POST",
		dataType: "HTML",
		data: formData,
		cache: false,
		contentType: false,
		processData: false
	}).done(function(echo){
		$("#mensaje").html(echo);
	});
});
</script>
</body>

La estructura del $.ajax de jQuery en esas líneas funciona de la siguiente manera:

  1. new FormData(document.getElementById(“enviarimagenes”)); -> Crea el objeto FormData, el cual obtiene los datos del formulario.
  2. url: “subir.php” -> URL del archivo donde se van a enviar las peticiones.
  3. type: “POST” -> Establece el método de envío de datos.
  4. dataType: “HTML” -> El tipo de datos que se espera que devolverá el servidor.
  5. data: formData -> Enviará los datos desde el objeto FormData.
  6. cache: false -> Fuerza a no cachear las páginas por el explorador.
  7. contentType: false -> No establece contentType.
  8. processData: false -> “By setting the processData option to false, the automatic conversion of data to strings is prevented.”
  9. .done(function(echo){$(“#mensaje”).html(echo);}); -> Callback para cuando se ha completado el envío, el cual devuelve la información desde subir.php (esto lo veremos más adelante) en el contenedor con ID mensaje.
3 de 6: MySQL

En este ejemplo tengo una base de datos llamada mmv con cotejamiento utf8_spanish_ci. Dentro tengo una tabla llamada mmv002 que tiene cuatro columnas. El motor de almacenamiento es InnoDB.

  1. id -> INT(5) -> A_I
  2. titulo -> varchar(30) -> utf8_spanish_ci
  3. descripcion -> text ->utf8_spanish_ci
  4. imagen -> longblob

4 de 6: PHP

Ahora viene la parte interesante. Lo primero que debemos hacer es crear un archivo llamado subir.php (o cualquiera que sea el nombre que hayamos puesto en la URL del $.ajax de jQuery).

El archivo debe estar totalmente vacío. Las etiquetas HTML (doctype, html, head, body, etc.) que puedan generar algunos editores de texto (como Dreamweaver) deben ser eliminadas.

Entonces le decimos al documento que vamos a escribir PHP y requerimos nuestro archivo de conexión a la BBDD.

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
?>

Después obtenemos los datos de texto del formulario:

<?php
//Archivo de conexión a la base de datos
require('conexion.php');

//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];
?>

Ahora conviene realizar un filtro anti-XSS para el texto que se inserta en la BBDD.

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);
?>

Nota: En $caracteres_buenos debes unir los ampersand (&) con los caracteres que vienen después, o no funcionará.

Una vez tenemos esto, vamos a convertir los Enter del textarea en br (saltos de línea en HTML). Esto se hace con la función nl2br().

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);
?>

Ahora vamos a proceder a comprobar los datos que se entregan desde el formulario.

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);

//Comprobamos que los inputs no estén vacíos, y si lo están, mandamos el mensaje correspondiente
if(empty($titulo)) {
	die( 'Es necesario establecer un título' );
} elseif(empty($descripcion)) {
	die( 'Es necesario establecer una descripción' );
	//"Error 4" en los array de $_FILES significa que ningún archivo fue subido o incluido en el input
	//Más info en http://php.net/manual/es/features.file-upload.errors.php
} elseif($_FILES['imagen']['error'] === 4) {
	die( 'Es necesario establecer una imagen' );
	//Si los inputs están seteados y el archivo no tiene errores, se procede
} else if(isset($descripcion) AND isset($titulo) AND $_FILES['imagen']['error'] === 0 ) {
	//Otras comprobaciones
};
?>

Entonces debemos convertir la imagen enviada desde el formulario a ‘formato’ binario. Esto se hace, primero, escapando las barras con la función addslashes(), y después transformando el archivo en “su propio contenido” con file_get_contents().

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);

//Comprobamos que los inputs no estén vacíos, y si lo están, mandamos el mensaje correspondiente
if(empty($titulo)) {
	die( 'Es necesario establecer un título' );
} elseif(empty($descripcion)) {
	die( 'Es necesario establecer una descripción' );
	//"Error 4" en los array de $_FILES significa que ningún archivo fue subido o incluido en el input
	//Más info en http://php.net/manual/es/features.file-upload.errors.php
} elseif($_FILES['imagen']['error'] === 4) {
	die( 'Es necesario establecer una imagen' );
	//Si los inputs están seteados y el archivo no tiene errores, se procede
} else if(isset($descripcion) AND isset($titulo) AND $_FILES['imagen']['error'] === 0 ) {

	//Convertimos la información de la imagen en binario para insertarla en la BBDD
	$imagenBinaria = addslashes(file_get_contents($_FILES['imagen']['tmp_name']));

};
?>

Después obtenemos el nombre del archivo, y creamos un array con las extensiones permitidas. Luego obtenemos cada extensión por separado para después poder ver si están presentes en el nombre del archivo. Utilizaremos la función in_array() para comprobar si la extensión de la imagen es correcta.

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);

//Comprobamos que los inputs no estén vacíos, y si lo están, mandamos el mensaje correspondiente
if(empty($titulo)) {
	die( 'Es necesario establecer un título' );
} elseif(empty($descripcion)) {
	die( 'Es necesario establecer una descripción' );
	//"Error 4" en los array de $_FILES significa que ningún archivo fue subido o incluido en el input
	//Más info en http://php.net/manual/es/features.file-upload.errors.php
} elseif($_FILES['imagen']['error'] === 4) {
	die( 'Es necesario establecer una imagen' );
	//Si los inputs están seteados y el archivo no tiene errores, se procede
} else if(isset($descripcion) AND isset($titulo) AND $_FILES['imagen']['error'] === 0 ) {

	//Convertimos la información de la imagen en binario para insertarla en la BBDD
	$imagenBinaria = addslashes(file_get_contents($_FILES['imagen']['tmp_name']));

	//Nombre del archivo
	$nombreArchivo = $_FILES['imagen']['name'];

	//Extensiones permitidas
	$extensiones = array('jpg', 'jpeg', 'gif', 'png', 'bmp');

	//Obtenemos la extensión (en minúsculas) para poder comparar
	$extension = strtolower(end(explode('.', $nombreArchivo)));

	//Verificamos que sea una extensión permitida, si no lo es mostramos un mensaje de error
	if(!in_array($extension, $extensiones)) {
		die( 'Sólo se permiten archivos con las siguientes extensiones: '.implode(', ', $extensiones) );
	};
};
?>

Ahora debemos crear el else de la condición anterior, donde obtendremos el tamaño del archivo, y comprobaremos que no sea mayor a 2 MB (por ejemplo, esta cantidad se puede cambiar).

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);

//Comprobamos que los inputs no estén vacíos, y si lo están, mandamos el mensaje correspondiente
if(empty($titulo)) {
	die( 'Es necesario establecer un título' );
} elseif(empty($descripcion)) {
	die( 'Es necesario establecer una descripción' );
	//"Error 4" en los array de $_FILES significa que ningún archivo fue subido o incluido en el input
	//Más info en http://php.net/manual/es/features.file-upload.errors.php
} elseif($_FILES['imagen']['error'] === 4) {
	die( 'Es necesario establecer una imagen' );
	//Si los inputs están seteados y el archivo no tiene errores, se procede
} else if(isset($descripcion) AND isset($titulo) AND $_FILES['imagen']['error'] === 0 ) {

	//Convertimos la información de la imagen en binario para insertarla en la BBDD
	$imagenBinaria = addslashes(file_get_contents($_FILES['imagen']['tmp_name']));

	//Nombre del archivo
	$nombreArchivo = $_FILES['imagen']['name'];

	//Extensiones permitidas
	$extensiones = array('jpg', 'jpeg', 'gif', 'png', 'bmp');

	//Obtenemos la extensión (en minúsculas) para poder comparar
	$extension = strtolower(end(explode('.', $nombreArchivo)));

	//Verificamos que sea una extensión permitida, si no lo es mostramos un mensaje de error
	if(!in_array($extension, $extensiones)) {
		die( 'Sólo se permiten archivos con las siguientes extensiones: '.implode(', ', $extensiones) );
	} else {
		//Si la extensión es correcta, procedemos a comprobar el tamaño del archivo subido
		//Y definimos el máximo que se puede subir
		//Por defecto el máximo es de 2 MB, pero se puede aumentar desde el .htaccess o en la directiva 'upload_max_filesize' en el php.ini

		$tamañoArchivo = $_FILES['imagen']['size']; //Obtenemos el tamaño del archivo en Bytes
		$tamañoArchivoKB = round(intval(strval( $tamañoArchivo / 1024 ))); //Pasamos el tamaño del archivo a KB

		$tamañoMaximoKB = "2048"; //Tamaño máximo expresado en KB
		$tamañoMaximoBytes = $tamañoMaximoKB * 1024; // -> 2097152 Bytes -> 2 MB

		//Comprobamos el tamaño del archivo, y mostramos un mensaje si es mayor al tamaño expresado en Bytes
		if($tamañoArchivo > $tamañoMaximoBytes) {
			die( "El archivo ".$nombreArchivo." es demasiado grande. El tamaño máximo del archivo es de ".$tamañoMaximoKB."Kb." );
		};
	};
};
?>

Entonces, si las extensiones y el tamaño están bien, generamos la consulta SQL, insertamos y vaciamos los inputs.

<?php
//Archivo de conexión a la base de datos
require('conexion.php');
	
//Creamos las variables necesarias
$titulo = $_POST['titulo'];
$descripcion = $_POST['descripcion'];

//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");

$titulo = str_replace($caracteres_malos, $caracteres_buenos, $titulo);
$descripcion = str_replace($caracteres_malos, $caracteres_buenos, $descripcion);

//Cambiamos los ENTER por <br>
$descripcion = nl2br($descripcion);

//Comprobamos que los inputs no estén vacíos, y si lo están, mandamos el mensaje correspondiente
if(empty($titulo)) {
	die( 'Es necesario establecer un título' );
} elseif(empty($descripcion)) {
	die( 'Es necesario establecer una descripción' );
	//"Error 4" en los array de $_FILES significa que ningún archivo fue subido o incluido en el input
	//Más info en http://php.net/manual/es/features.file-upload.errors.php
} elseif($_FILES['imagen']['error'] === 4) {
	die( 'Es necesario establecer una imagen' );
	//Si los inputs están seteados y el archivo no tiene errores, se procede
} else if(isset($descripcion) AND isset($titulo) AND $_FILES['imagen']['error'] === 0 ) {

	//Convertimos la información de la imagen en binario para insertarla en la BBDD
	$imagenBinaria = addslashes(file_get_contents($_FILES['imagen']['tmp_name']));

	//Nombre del archivo
	$nombreArchivo = $_FILES['imagen']['name'];

	//Extensiones permitidas
	$extensiones = array('jpg', 'jpeg', 'gif', 'png', 'bmp');

	//Obtenemos la extensión (en minúsculas) para poder comparar
	$extension = strtolower(end(explode('.', $nombreArchivo)));
	
	//Verificamos que sea una extensión permitida, si no lo es mostramos un mensaje de error
	if(!in_array($extension, $extensiones)) {
		die( 'Sólo se permiten archivos con las siguientes extensiones: '.implode(', ', $extensiones) );
	} else {
		//Si la extensión es correcta, procedemos a comprobar el tamaño del archivo subido
		//Y definimos el máximo que se puede subir
		//Por defecto el máximo es de 2 MB, pero se puede aumentar desde el .htaccess o en la directiva 'upload_max_filesize' en el php.ini

		$tamañoArchivo = $_FILES['imagen']['size']; //Obtenemos el tamaño del archivo en Bytes
		$tamañoArchivoKB = round(intval(strval( $tamañoArchivo / 1024 ))); //Pasamos el tamaño del archivo a KB

		$tamañoMaximoKB = "2048"; //Tamaño máximo expresado en KB
		$tamañoMaximoBytes = $tamañoMaximoKB * 1024; // -> 2097152 Bytes -> 2 MB

		//Comprobamos el tamaño del archivo, y mostramos un mensaje si es mayor al tamaño expresado en Bytes
		if($tamañoArchivo > $tamañoMaximoBytes) {
			die( "El archivo ".$nombreArchivo." es demasiado grande. El tamaño máximo del archivo es de ".$tamañoMaximoKB."Kb." );
		} else {
			//Si el tamaño es correcto, subimos los datos
			$consulta = "INSERT INTO mmv002 (titulo, descripcion, imagen) VALUES ('$titulo', '$descripcion', '$imagenBinaria')";

			//Hacemos la inserción, y si es correcta, se procede
			if(mysqli_query($conexion, $consulta)) {
				//Reiniciamos los inputs
				echo '<script>
$("#enviarimagenes input,textarea").each(function(index) {
	$(this).val("");
});
</script>';
				//Cerramos la conexión con MySQL
				mysqli_close($conexion);
				//Mostramos un mensaje
				die( "El archivo con el nombre ".$nombreArchivo." fue subido. Su peso es de ".$tamañoArchivoKB." KB." );
			} else {
				//Si hay algún error con la inserción, se muestra un mensaje
				die( "Parece que ha habido un error. Recargue la página e inténtelo nuevamente." );
			};

		};//Fin condicional tamaño archivo

	};//Fin condicional extensiones

};//Fin condicional para saber si todos los campos necesarios están completos
?>
5 de 6: Modificaciones finales

Para poder mostrar las imágenes debemos mostrarlas como base64. Primero, requerimos nuestro archivo de conexión a la BBDD en el tope del archivo donde tenemos el formulario (por encima del DOCTYPE). Después generamos una consulta a todos los datos en nuestra tabla, y después los mostramos desde un bucle while.

<?php
$consulta = "SELECT * FROM mmv002";
$resultado = $conexion->query($consulta);

while ($datos = $resultado->fetch_assoc()) {
?>

<div id="resultados">
	<p><b>ID:</b> <?php echo $datos['id'] ?></p>
	<p><b>Título:</b> <?php echo $datos['titulo'] ?></p>
    <p><b>Descripcion:</b><br><?php echo $datos['descripcion'] ?></p>
    <p><b>Imagen:</b></p>
    <img src="data:image/jpeg;base64,<?php echo base64_encode($datos['imagen']); ?>" />
</div>

<hr>
<?php
};
?>
6 de 6: Ejemplos

Una vez hecho todo lo anterior, podemos observar los resultados finales. Yo no lo he aplicado ningún estilo, pero se puede hacer sin problemas.

Conclusión:

Es más fácil de lo que parece, es todo cuestión de comprender como funciona cada parte, desde el HTML hasta la base de datos. Si te sirvió, por favor, compártelo.

Espero que el tutorial haya sido de utilidad. Nos leemos, ¡saludos!

14 comments

  1. Luis · diciembre 18

    No me sirvio el ejemplo. No entra a la 1era funcion del javascript

    Me gusta

    • Rocanrol · diciembre 18

      Hola, Luis.

      ¿A qué función te refieres? Esto es jQuery, no Javascript.

      Saludos.

      Me gusta

  2. Walter Jimenez · marzo 1

    Muy bueno el tutorial, bien explicado. Al que no le funciona es por que necesita todo masticado, hice mis pruebas adaptandolo a codeigniter y funciona perfectamente. Muchas gracias.

    Me gusta

    • Rocanrol · marzo 1

      ¡Hola Walter! Gracias por el comentario.

      Un abrazo.

      Me gusta

      • Walter Jimenez · marzo 2

        Una consulta. Tengo una tabla estudiantes, a cada quien le guarde la imagen en el campo mysql, luego en una vista de un formulario muestro el listado de los estudiantes con sus fotos, hasta ahí no hay problema. El problema ocurre cuando quiero filtrar por la cédula del estudiante en ese mismo formulario, la respuesta viene por ajax, me arroja la consulta pero la imagen no me la muestra. He buscado pero no he podido solucionarlo. Alguna idea?

        Me gusta

      • Rocanrol · marzo 2

        ¿Cómo es que “te arroja la consulta”? No entiendo.

        ¿Estás mostrando correctamente la imagen?

        Me gusta

  3. $extension = strtolower(end(explode(‘.’, $nombreArchivo)));
    aqui me sale un error

    Me gusta

    • Rocanrol · noviembre 4

      ¿Qué error te sale? ¿Comprobaste que los nombres de las variables estén bien?

      Me gusta

  4. hola

    Me gusta

    • Rocanrol · noviembre 4

      ¿Qué clase de comentario es este? jajaja

      Me gusta

  5. Rolando Morales · 7 Days Ago

    Hola, muchas gracias, me ha funcionado, pero igual me arroja un error, que supongo que es el mismo que le sale a “Kevin Arnold Peña Bardalez”.
    Para ser mas precisos, en esta parte del código:
    //Obtenemos la extensión (en minúsculas) para poder comparar
    $extension = strtolower(end(explode(‘.’, $nombreArchivo)));

    y el mensaje que arroja es: Strict standards: Only variables should be passed by reference in (la ruta de mi proyecto).

    Saludos, muchas gracias nuevamente.

    Me gusta

    • Rocanrol · 7 Days Ago

      Hola;

      esto se soluciona separando las funciones.

      $extension = explode('.', $nombreArchivo);
      	
      $extension = end($extension);
      		
      $extension = strtolower($extension);

      Me gusta

  6. Luis Alfredo · 4 Days Ago

    hola, me gustó mucho tu ejemplo, pero tengo un problema, es que necesito subir un solo archivo para referenciarlo a varias personas en mi base de datos, el asunto está en que en mi función primero necesito enviar la imagen al php que sube los archivos a la bdd y luego cuando retorne el success llame a otro .php para referenciar ese archivo con todas las personas a las que se les asigna. mi pregunta es: ¿se puede hacer una función que llame a dos archivos php diferentes?

    Me gusta

    • Rocanrol · 4 Days Ago

      Hola, no entiendo exactamente qué necesitas.

      ¿Probaste a incluir ese otro php? Usando require() o include().

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s