{"id":28475,"date":"2021-05-26T09:20:00","date_gmt":"2021-05-26T06:20:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28475"},"modified":"2021-10-17T16:44:45","modified_gmt":"2021-10-17T13:44:45","slug":"arrastrar-y-soltar-carga-de-varios-archivos-usando-javascript-y-php","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/arrastrar-y-soltar-carga-de-varios-archivos-usando-javascript-y-php\/","title":{"rendered":"Arrastrar y soltar carga de varios archivos usando JavaScript y PHP"},"content":{"rendered":"<p>En el pasado, escrib\u00ed un art\u00edculo <a href=\"https:\/\/themewp.inform.click\/es\/arrastrar-y-soltar-carga-de-archivos-usando-javascript-y-php\/\" title=\"Arrastrar y soltar carga de archivos usando JavaScript y PHP\" >Arrastrar y soltar carga de archivos usando JavaScript y PHP<\/a>. Algunos lectores pidieron escribir un art\u00edculo sobre c\u00f3mo agregar un cargador de archivos que permite a los usuarios cargar varios archivos con las funciones de arrastrar y soltar.<\/p>\n<p>Mientras trabaja en una aplicaci\u00f3n web, es posible que deba cargar varios archivos con un solo cargador en su formulario. Puede ayudar a un usuario a cargar uno o varios archivos de una sola vez. No les gusta cargar varios archivos uno por uno. Dar una funci\u00f3n de carga de archivos de este tipo agrega una mejor experiencia de usuario y tambi\u00e9n acelera su aplicaci\u00f3n.<\/p>\n<p>En este art\u00edculo, le muestro c\u00f3mo agregar este cargador de archivos sin usar ning\u00fan complemento externo de arrastrar y soltar. Subir\u00e9 los archivos usando Ajax. Significa que los archivos se cargar\u00e1n en el servidor sin volver a cargar una p\u00e1gina completa.<\/p>\n<h3>Empezando<\/h3>\n<p>Como dije, no usaremos ning\u00fan complemento externo para la funci\u00f3n de arrastrar y soltar. Voy a escribir todo el c\u00f3digo desde cero. Es mucho m\u00e1s f\u00e1cil. No hay cosas complejas en \u00e9l. Simplemente siga los pasos a continuaci\u00f3n y listo.<\/p>\n<p>Creemos un archivo <code>index.html<\/code>y agreguemos el c\u00f3digo a continuaci\u00f3n.<\/p>\n<p><strong>index.html<\/strong><\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta charset=\"UTF-8\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;title&gt;Drag Drop Multiple File Upload&lt;\/title&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;link rel=\"stylesheet\" href=\"style.css\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;div id=\"drop_file_zone\" ondrop=\"upload_file(event)\" ondragover=\"return false\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div id=\"drag_upload_file\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;Drop file(s) here&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;or&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;&lt;input type=\"button\" value=\"Select File(s)\" onclick=\"file_explorer();\"&gt;&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"file\" id=\"selectfile\" multiple&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/3.5.1\/jquery.min.js\"&gt;&lt;\/script&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"custom.js\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>Aqu\u00ed lo inclu\u00ed <code>style.css<\/code>y <code>custom.js<\/code>en el que agregaremos un c\u00f3digo relacionado. Como tenemos la intenci\u00f3n de usar Ajax, inclu\u00ed una biblioteca jQuery.<\/p>\n<p>Para proporcionar una interfaz de usuario b\u00e1sica para nuestro cargador de archivos, agreguemos algunas propiedades CSS. Por supuesto, puede agregar su propio CSS para darle un aspecto diferente al cargador de archivos.<\/p>\n<p><strong>style.css<\/strong><\/p>\n<pre><code>#drop_file_zone {\n\u00a0\u00a0\u00a0\u00a0background-color: #EEE;\n\u00a0\u00a0\u00a0\u00a0border: #999 5px dashed;\n\u00a0\u00a0\u00a0\u00a0width: 290px;\n\u00a0\u00a0\u00a0\u00a0height: 200px;\n\u00a0\u00a0\u00a0\u00a0padding: 8px;\n\u00a0\u00a0\u00a0\u00a0font-size: 18px;\n}\n#drag_upload_file {\n\u00a0\u00a0\u00a0\u00a0width:50%;\n\u00a0\u00a0\u00a0\u00a0margin:0 auto;\n}\n#drag_upload_file p {\n\u00a0\u00a0\u00a0\u00a0text-align: center;\n}\n#drag_upload_file #selectfile {\n\u00a0\u00a0\u00a0\u00a0display: none;\n}<\/code><\/pre>\n<p>Despu\u00e9s de esto, deber\u00eda ver su cargador de archivos como la siguiente captura de pantalla:<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20458-6081f4f9475a9.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20458-6081f4f9475a9.png\" alt=\"Arrastrar y soltar carga de varios archivos usando JavaScript y PHP\" ><\/a><\/p>\n<h3>Arrastra y suelta varios archivos con JavaScript y PHP<\/h3>\n<p>Est\u00e1s configurado con la interfaz de usuario b\u00e1sica. Ahora, podemos seguir adelante y escribir c\u00f3digo real para JavaScript y PHP que cargan archivos en un servidor. En nuestro HTML agregu\u00e9 2 m\u00e9todos upload_file() y file_explorer () que reciben llamadas en archivos soltados y archivos seleccionados respectivamente.<\/p>\n<p>Definamos estos m\u00e9todos y pasemos los archivos al script del lado del servidor que carga los archivos en un servidor.<\/p>\n<p><strong>custom.js<\/strong><\/p>\n<pre><code>var fileobj;\nfunction upload_file(e) {\n\u00a0\u00a0\u00a0\u00a0e.preventDefault();\n\u00a0\u00a0\u00a0\u00a0ajax_file_upload(e.dataTransfer.files);\n}\n\u00a0\nfunction file_explorer() {\n\u00a0\u00a0\u00a0\u00a0document.getElementById('selectfile').click();\n\u00a0\u00a0\u00a0\u00a0document.getElementById('selectfile').onchange = function() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0files = document.getElementById('selectfile').files;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ajax_file_upload(files);\n\u00a0\u00a0\u00a0\u00a0};\n}\n\u00a0\nfunction ajax_file_upload(file_obj) {\n\u00a0\u00a0\u00a0\u00a0if(file_obj != undefined) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var form_data = new FormData();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for(i=0; i&lt;file_obj.length; i++) {\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0form_data.append('file[]', file_obj[i]);\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$.ajax({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: 'POST',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url: 'ajax.php',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0contentType: false,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0processData: false,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data: form_data,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0success:function(response) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0alert(response);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('#selectfile').val('');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Finalmente, escriba un c\u00f3digo del lado del servidor para cargar el <code>ajax.php<\/code>archivo en el archivo.<\/p>\n<p><strong>ajax.php<\/strong><\/p>\n<pre><code>&lt;?php\nforeach($_FILES['file']['name'] as $key=&gt;$val){\n\u00a0\u00a0\u00a0\u00a0$file_name = $_FILES['file']['name'][$key];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\/\/ get file extension\n\u00a0\u00a0\u00a0\u00a0$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\/\/ get filename without extension\n\u00a0\u00a0\u00a0\u00a0$filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0if (!file_exists(getcwd(). '\/uploads')) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mkdir(getcwd(). '\/uploads', 0777);\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$filename_to_store = $filenamewithoutextension. '_' .uniqid(). '.' .$ext;\n\u00a0\u00a0\u00a0\u00a0move_uploaded_file($_FILES['file']['tmp_name'][$key], getcwd(). '\/uploads\/'.$filename_to_store);\n}\necho \"File(s) uploaded successfully\";\ndie;<\/code><\/pre>\n<p>Este c\u00f3digo crea un directorio de &#8216;cargas&#8217; en su servidor y almacena todos los archivos dentro de este directorio. Mientras almacenamos archivos en un servidor, nos encargamos de mantener el nombre \u00fanico de cada archivo cargado usando la funci\u00f3n PHP <code>uniqid()<\/code>.<\/p>\n<p>Se trata de cargar varios archivos mediante la funci\u00f3n de arrastrar y soltar. Espero que lo conozcas. Me gustar\u00eda escuchar sus pensamientos y sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/optimizacion-de-imagenes-mediante-el-paquete-artisansweb-image-optimizer\/\" title=\"Optimizaci\u00f3n de im\u00e1genes mediante el paquete artisansweb \/ image-optimizer\" >Optimizaci\u00f3n de im\u00e1genes mediante el paquete artisansweb \/ image-optimizer<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/como-implementar-la-carga-de-fragmentos-en-php\/\" title=\"C\u00f3mo implementar la carga de fragmentos en PHP\" >C\u00f3mo implementar la carga de fragmentos en PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/como-leer-texto-de-una-imagen-en-php\/\" title=\"C\u00f3mo leer texto de una imagen en PHP\" >C\u00f3mo leer texto de una imagen en PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfDesea implementar la funci\u00f3n de carga de archivos m\u00faltiples de arrastrar y soltar en su sitio web? En este art\u00edculo, estudiamos c\u00f3mo agregar un cargador de archivos que permita<\/p>\n","protected":false},"author":1,"featured_media":21646,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[243],"tags":[849],"class_list":["post-28475","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=28475"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/21646"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=28475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=28475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=28475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}