{"id":7001,"date":"2018-10-04T08:11:51","date_gmt":"2018-10-04T08:11:51","guid":{"rendered":"https:\/\/www.jose-aguilar.com\/blog\/?p=7001"},"modified":"2018-10-04T08:11:51","modified_gmt":"2018-10-04T08:11:51","slug":"como-subir-una-imagen-con-jquery-ajax-php","status":"publish","type":"post","link":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/","title":{"rendered":"Como subir una imagen con jQuery, Ajax y PHP"},"content":{"rendered":"<p>En este art\u00edculo vamos a explicar como\u00a0permitir al usuario subir una imagen al servidor con <strong>jQuery<\/strong>, <strong>Ajax<\/strong> y <strong>PHP<\/strong> sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.<\/p>\n<p>En el ejemplo en funcionamiento tenemos un formulario que contiene un imagen, el campo para seleccionar un archivo y un bot\u00f3n para realizar la subida. El usuario puede subir una imagen en formato png, jpg o gif. La imagen es cargada al servidor y se pre visualiza en pantalla sin recargar la p\u00e1gina despu\u00e9s de pulsar el bot\u00f3n \u00abSubir\u00bb.<\/p>\n<p>\u00bfC\u00f3mo lo conseguimos?<\/p>\n<p>Hace tiempo andaba buscando un c\u00f3digo como este que simplifique mucho el proceso, usando menos recursos y con un efecto similar. Resulta que es muy sencillo. Lo vamos a explicar utilizando el ejemplo que hemos creado para este tutorial.<\/p>\n<h2>Aspecto visual o dise\u00f1o<\/h2>\n<p>La interfaz o aspecto visual es el siguiente:<\/p>\n<p><a href=\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/sube-tu-foto-ajax-bootstrap\/\" rel=\"attachment wp-att-7002\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7002\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap.png\" alt=\"\" width=\"317\" height=\"587\" srcset=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap.png 317w, https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-162x300.png 162w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/a><\/p>\n<p>Conseguido sin mucho esfuerzo gracias a la tecnolog\u00eda <strong>Bootstrap 4<\/strong>.<\/p>\n<h2>C\u00f3digo JavaScript necesario<\/h2>\n<p>En la cabecera o dentro de la etiqueta &lt;head&gt; de tu p\u00e1gina tienes que agregar la librer\u00eda <strong>jQuery<\/strong> y la llamada al evento:<\/p>\n<div id=\"wpshdo_1\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_1\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_1\"><\/a><a id=\"wpshat_1\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_1\"  onClick=\"javascript:wpsh_toggleBlock(1)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_code(1)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_print(1)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_1\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\"><span class=\"sy0\">&lt;<\/span>script src<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;https:\/\/code.jquery.com\/jquery-3.2.1.js&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span>\n<span class=\"sy0\">&lt;<\/span>script<span class=\"sy0\">&gt;<\/span>\n$<span class=\"br0\">&#40;<\/span>document<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">ready<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    $<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;.upload&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'click'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n        <span class=\"kw2\">var<\/span> formData <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> FormData<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"kw2\">var<\/span> files <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'#image'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">[<\/span>0<span class=\"br0\">]<\/span>.<span class=\"me1\">files<\/span><span class=\"br0\">[<\/span>0<span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n        formData.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'file'<\/span><span class=\"sy0\">,<\/span>files<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n        $.<span class=\"me1\">ajax<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>\n            url<span class=\"sy0\">:<\/span> <span class=\"st0\">'upload.php'<\/span><span class=\"sy0\">,<\/span>\n            type<span class=\"sy0\">:<\/span> <span class=\"st0\">'post'<\/span><span class=\"sy0\">,<\/span>\n            data<span class=\"sy0\">:<\/span> formData<span class=\"sy0\">,<\/span>\n            contentType<span class=\"sy0\">:<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">,<\/span>\n            processData<span class=\"sy0\">:<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">,<\/span>\n            success<span class=\"sy0\">:<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span>response<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n                <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>response <span class=\"sy0\">!=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n                    $<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;.card-img-top&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;src&quot;<\/span><span class=\"sy0\">,<\/span> response<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n                <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n                    <span class=\"kw3\">alert<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Formato de imagen incorrecto.'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n                <span class=\"br0\">&#125;<\/span>\n            <span class=\"br0\">&#125;<\/span>\n        <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"sy0\">&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span><\/pre><\/div><\/div>\n<p>El c\u00f3digo anterior tambi\u00e9n puede estar incrustado justo antes de la etiqueta de cierre &lt;\/body&gt;.<\/p>\n<p>Tan solo estamos esperando a que se haga click en el bot\u00f3n que contiene la clase \u00abupload\u00bb para obtener el archivo seleccionado desde el ordenador para pasarlo al archivo \u00abupload.php\u00bb para que pueda ser procesado en el servidor. Una vez se ha proceso la imagen en el servidor, si la respuesta es diferente de 0, el atributo src de nuestra imagen se cambiar\u00e1 por la respuesta. En caso contrario mostrar un alerta de error.<\/p>\n<p>La clave del asunto est\u00e1 en la utilizaci\u00f3n de la clase <strong>FormData<\/strong>.<\/p>\n<p>Los objetos <strong>FormData<\/strong> permiten compilar un conjunto de pares clave\/valor para enviar mediante <strong>XMLHttpRequest<\/strong>. Est\u00e1n destinados principalmente para el env\u00edo de los datos del formulario, pero se pueden utilizar de forma independiente con el fin de transmitir los datos tecleados. Los datos transmitidos estar\u00e1n en el mismo formato que usa el m\u00e9todo submit() del formulario para enviar los datos si el tipo de codificaci\u00f3n del formulario se establece en \u00abmultipart\/form-data\u00bb.<\/p>\n<p>En el ejemplo estamos creando un objeto de tipo <strong>FormData<\/strong> para agregarle la imagen. El objeto <strong>FormData<\/strong> se lo pasamos al archivo <strong>PHP<\/strong> mediante la t\u00e9cnica <strong>Ajax<\/strong>. De esta forma, en el archivo <strong>PHP<\/strong> tendremos la informaci\u00f3n necesaria para procesar la imagen.<\/p>\n<p>Este c\u00f3digo tambi\u00e9n puede ser \u00fatil para subir otro tipo de archivos, tan solo realizando algunos ajustes.<\/p>\n<h2>C\u00f3digo HTML que debes a\u00f1adir dentro del body de tu p\u00e1gina<\/h2>\n<p>En el cuerpo o dentro de la etiqueta &lt;body&gt; agregamos el formulario que permite subir archivos:<\/p>\n<div id=\"wpshdo_2\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_2\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_2\"><\/a><a id=\"wpshat_2\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_2\"  onClick=\"javascript:wpsh_toggleBlock(2)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_code(2)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_print(2)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_2\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"html4strict\" style=\"font-family:monospace;\"><span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/form.html\"><span class=\"kw2\">form<\/span><\/a> <span class=\"kw3\">method<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;post&quot;<\/span> <span class=\"kw3\">action<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;#&quot;<\/span> <span class=\"kw3\">enctype<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;multipart\/form-data&quot;<\/span>&gt;<\/span>\n    <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;card&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;width: 18rem;&quot;<\/span>&gt;<\/span>\n        <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/img.html\"><span class=\"kw2\">img<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;card-img-top&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;images\/default-avatar.png&quot;<\/span>&gt;<\/span>\n        <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;card-body&quot;<\/span>&gt;<\/span>\n            <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/h5.html\"><span class=\"kw2\">h5<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;card-title&quot;<\/span>&gt;<\/span>Sube una foto<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/h5.html\"><span class=\"kw2\">h5<\/span><\/a>&gt;<\/span>\n            <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/p.html\"><span class=\"kw2\">p<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;card-text&quot;<\/span>&gt;<\/span>Sube una imagen...<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/p.html\"><span class=\"kw2\">p<\/span><\/a>&gt;<\/span>\n            <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;form-group&quot;<\/span>&gt;<\/span>\n                <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/label.html\"><span class=\"kw2\">label<\/span><\/a> <span class=\"kw3\">for<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;image&quot;<\/span>&gt;<\/span>Nueva imagen<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/label.html\"><span class=\"kw2\">label<\/span><\/a>&gt;<\/span>\n                <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/input.html\"><span class=\"kw2\">input<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;file&quot;<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;form-control-file&quot;<\/span> <span class=\"kw3\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;image&quot;<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;image&quot;<\/span>&gt;<\/span>\n            <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span>\n            <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/input.html\"><span class=\"kw2\">input<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;button&quot;<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;btn btn-primary upload&quot;<\/span> <span class=\"kw3\">value<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;Subir&quot;<\/span>&gt;<\/span>\n        <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span>\n    <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/form.html\"><span class=\"kw2\">form<\/span><\/a>&gt;<\/span><\/pre><\/div><\/div>\n<p>Se trata de un formulario simple que utiliza el atributo\u00a0<em>enctype=\u00bbmultipart\/form-data\u00bb\u00a0<\/em>para permitir la subida de archivos y se apoya de la tecnolog\u00eda <strong>Bootstrap<\/strong> para el dise\u00f1o. Tan solo tenemos una imagen por defecto, el campo para seleccionar una imagen desde el ordenador y un bot\u00f3n que permite realizar la acci\u00f3n de subida al servidor.<\/p>\n<h2>C\u00f3digo PHP que se ejecuta en el servidor<\/h2>\n<p>El arhivo \u00abupload.php\u00bb que usamos para procesar la imagen contiene lo siguiente:<\/p>\n<div id=\"wpshdo_3\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_3\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_3\"><\/a><a id=\"wpshat_3\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_3\"  onClick=\"javascript:wpsh_toggleBlock(3)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_code(3)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_print(3)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_3\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"php\" style=\"font-family:monospace;\"><span class=\"kw2\">&lt;?php<\/span>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;file&quot;<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;image\/pjpeg&quot;<\/span><span class=\"br0\">&#41;<\/span>\n    <span class=\"sy0\">||<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;file&quot;<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;image\/jpeg&quot;<\/span><span class=\"br0\">&#41;<\/span>\n    <span class=\"sy0\">||<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;file&quot;<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;image\/png&quot;<\/span><span class=\"br0\">&#41;<\/span>\n    <span class=\"sy0\">||<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;file&quot;<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;image\/gif&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/move_uploaded_file\"><span class=\"kw3\">move_uploaded_file<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;file&quot;<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st0\">&quot;tmp_name&quot;<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;images\/&quot;<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st_h\">'file'<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st_h\">'name'<\/span><span class=\"br0\">]<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n        <span class=\"co1\">\/\/more code here...<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">&quot;images\/&quot;<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$_FILES<\/span><span class=\"br0\">[<\/span><span class=\"st_h\">'file'<\/span><span class=\"br0\">]<\/span><span class=\"br0\">[<\/span><span class=\"st_h\">'name'<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">&#125;<\/span>\n<span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><\/pre><\/div><\/div>\n<p>Simplemente comprobamos que el archivo que se est\u00e1 intentando subir sea del tipo adecuado. En este caso, solo queremos que se puedan subir im\u00e1genes .png, .jpg o .gif y, seguidamente, usamos la funci\u00f3n <em>move_uploaded_file()<\/em> de <strong>PHP<\/strong> para depositar el archivo seleccionado en el lugar que deseamos. Lo guardamos con el mismo nombre de subida.<\/p>\n<p>Despu\u00e9s de esta acci\u00f3n se podr\u00edan hacer muchos m\u00e1s procesos, como por ejemplo registrar algo en la base de datos o enviar un email. Recuerda que todo esto se puede hacer sin recargar la p\u00e1gina.<\/p>\n<p>Como respuesta usamos la funci\u00f3n echo de <strong>PHP<\/strong> para retornar un 0 en caso de error o la ruta del archivo subido para depositarlo en el src tal y como puedes ver en el success de la llamada <strong>Ajax<\/strong>.<\/p>\n<h2>Conclusiones<\/h2>\n<p>El efecto que conseguimos con este c\u00f3digo de ejemplo se puede conseguir con infinidad de plugins de terceros que andan rondando por la Web pero, pensamos que este c\u00f3digo puede resultar muy \u00fatil en casos extremos en los que sea necesario utilizar los menos recursos posibles para hacerlo funcionar o en casos que se necesite algo simple para permitir al usuario subir una imagen. El caso es que los plugins de terceros suelen tener infinidad de opciones que finalmente no se utilizan, lo que los hace muy complejos y grandes en tama\u00f1o para tenerlos depositados en el servidor.<\/p>\n<p class=\"text-center\"><a class=\"btn btn-secondary\" href=\"https:\/\/www.jose-aguilar.com\/scripts\/jquery\/upload-image-with-ajax\/\" target=\"_blank\" rel=\"noopener\"><i class=\"fa fa-eye\"><\/i> Ver demo<\/a> <a class=\"btn btn-primary\" href=\"https:\/\/www.jose-aguilar.com\/scripts\/jquery\/upload-image-with-ajax\/upload-image-with-ajax.zip\"><i class=\"fa fa-download\"><\/i> Descargar<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.<\/p>\n","protected":false},"author":1,"featured_media":7004,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,5,3],"tags":[84,110],"class_list":["post-7001","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ajax","category-jquery","category-php","tag-formularios","tag-imagenes"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog<\/title>\n<meta name=\"description\" content=\"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog\" \/>\n<meta property=\"og:description\" content=\"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/\" \/>\n<meta property=\"og:site_name\" content=\"Jose Aguilar Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/joseaguilarblog\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-04T08:11:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png\" \/>\n\t<meta property=\"og:image:width\" content=\"313\" \/>\n\t<meta property=\"og:image:height\" content=\"349\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jose Aguilar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:site\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jose Aguilar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/\",\"name\":\"Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png\",\"datePublished\":\"2018-10-04T08:11:51+00:00\",\"author\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\"},\"description\":\"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png\",\"contentUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png\",\"width\":313,\"height\":349},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.jose-aguilar.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como subir una imagen con jQuery, Ajax y PHP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/\",\"name\":\"Jose Aguilar Blog\",\"description\":\"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\",\"name\":\"Jose Aguilar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"caption\":\"Jose Aguilar\"},\"description\":\"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.\",\"sameAs\":[\"https:\/\/plus.google.com\/114357189801512615537\"],\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog","description":"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"es_ES","og_type":"article","og_title":"Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog","og_description":"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.","og_url":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/","og_site_name":"Jose Aguilar Blog","article_publisher":"https:\/\/www.facebook.com\/joseaguilarblog","article_published_time":"2018-10-04T08:11:51+00:00","og_image":[{"width":313,"height":349,"url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png","type":"image\/png"}],"author":"Jose Aguilar","twitter_card":"summary_large_image","twitter_creator":"@JoseAguilarBlog","twitter_site":"@JoseAguilarBlog","twitter_misc":{"Escrito por":"Jose Aguilar","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/","url":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/","name":"Como subir una imagen con jQuery, Ajax y PHP - Jose Aguilar Blog","isPartOf":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage"},"image":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage"},"thumbnailUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png","datePublished":"2018-10-04T08:11:51+00:00","author":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11"},"description":"Tutorial y c\u00f3digo de ejemplo que permite al usuario subir una imagen al servidor con jQuery, Ajax y PHP sin necesidad de recargar la p\u00e1gina y sin utilizar plugins de terceros.","breadcrumb":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#primaryimage","url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png","contentUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2018\/10\/sube-tu-foto-ajax-bootstrap-featured.png","width":313,"height":349},{"@type":"BreadcrumbList","@id":"https:\/\/www.jose-aguilar.com\/blog\/como-subir-una-imagen-con-jquery-ajax-php\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.jose-aguilar.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Como subir una imagen con jQuery, Ajax y PHP"}]},{"@type":"WebSite","@id":"https:\/\/www.jose-aguilar.com\/blog\/#website","url":"https:\/\/www.jose-aguilar.com\/blog\/","name":"Jose Aguilar Blog","description":"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11","name":"Jose Aguilar","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","caption":"Jose Aguilar"},"description":"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.","sameAs":["https:\/\/plus.google.com\/114357189801512615537"],"url":"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/"}]}},"_links":{"self":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/7001","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/comments?post=7001"}],"version-history":[{"count":0,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/7001\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media\/7004"}],"wp:attachment":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media?parent=7001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/categories?post=7001"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/tags?post=7001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}