{"id":7726,"date":"2011-07-01T14:47:40","date_gmt":"2011-07-01T12:47:40","guid":{"rendered":"https:\/\/www.artera.net\/it\/blog\/?p=7726"},"modified":"2023-02-27T14:48:55","modified_gmt":"2023-02-27T14:48:55","slug":"html5-upload-di-file-piu-pulito-con-xmlhttprequest2","status":"publish","type":"post","link":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/","title":{"rendered":"HTML5 &#8211; Upload di file con XMLHttpRequest 2"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignleft size-full wp-image-7803\" title=\"html5-upload\" src=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png\" alt=\"\" width=\"160\" height=\"160\" \/><strong>L&#8217;upload di file<\/strong> tramite pagine web come, ad esempio, il caricamento degli allegati ad una email, oppure le immagini da caricare in una gallery, ecc&#8230;, \u00e8 spesso tra i pensieri di molti <strong>web developers<\/strong>. Durante i primi anni del web, l&#8217;upload di file era gestito semplicemente da un form inviato ad un&#8217;altra pagina web: il browser ricaricava completamente la pagina impostata nell&#8217;action del form. Questo metodo andava, e va ancora, bene per siti semplici o istituzionali nei quali l&#8217;invio di form non \u00e8 l&#8217;aspetto essenziale a livello quantitativo per le prestazioni del software.<\/p>\n<p>Per quanto riguarda, invece, software pi\u00f9 complessi come web apps, gli sviluppatori hanno subito adottato nuove tecniche per la gestione dei form. <strong>Ajax<\/strong> ha cambiato il modo di <strong>realizzare software per il web<\/strong>. Il metodo classico per il caricamento di file \u00e8 stato, ed in gran parte \u00e8 ancora, l&#8217;invio del form ad un un iframe nascosto (<em>fake ajax<\/em>), che, impostato come target contenesse \u00a0lo script server side per la manipolazione dei dati. Tramite questa procedura la pagina principale non viene ricaricata e, dunque, l&#8217;invio dei dati risulta pi\u00f9 performante rispetto al passato.<\/p>\n<p>Oggi voglio analizzare il prossimo passo nella gestione dei form che, <strong>grazie alle nuove tecniche HTML5 e\u00a0XMLHttpRequest 2<\/strong> permette un caricamento ancora pi\u00f9 veloce e maneggevole anche per i file.<\/p>\n<h3>La struttura del form Html5<\/h3>\n<p>Ho voluto realizzare il form html5 con una struttura veramente semplice come \u00e8 bene predisporre per i primi test con le nuove tecnologie ed anche perch\u00e8 il grosso del lavoro \u00e8 gestito dal codice Js.<\/p>\n<p>[html]<br \/>\n&lt;form id=&quot;form1&quot; enctype=&quot;multipart\/form-data&quot; method=&quot;post&quot; action=&quot;filesystem\/upload&quot;&gt;<br \/>\n\t&lt;label for=&quot;fileToUpload&quot;&gt;Seleziona i file da caricare:&lt;\/label&gt;<br \/>\n\t&lt;input type=&quot;file&quot; name=&quot;fileToUpload&quot; id=&quot;fileToUpload&quot; multiple \/&gt;<br \/>\n&lt;div id=&quot;fileInfo&quot;&gt;&amp;nbsp;&lt;\/div&gt;<br \/>\n\t&lt;input type=&quot;submit&quot; id=&quot;fileUpload&quot; value=&quot;Upload&quot; \/&gt;<br \/>\n&lt;div id=&quot;progressNumber&quot;&gt;&amp;nbsp;&lt;\/div&gt;<br \/>\n&lt;\/form&gt;<br \/>\n[\/html]<\/p>\n<p>L&#8217;unica minuscola particolarit\u00e0 degna di nota \u00e8 l&#8217;utilizzazione della propriet\u00e0 <em>multiple per l&#8217;input[type=&#8221;file&#8221;]<\/em>. Grazie a questa propriet\u00e0 html5 i browser moderni permettono di caricare pi\u00f9 file contemporaneamente attraverso un unico campo di input.<\/p>\n<h3>Visualizzare i dati dei file<\/h3>\n<p>Il primo step da realizzare con javascript per offrire un miglior controllo del flusso di caricamento all&#8217;utente \u00e8 elencare le informazioni tecniche dei file selezionati prima del caricamento:<\/p>\n<figure id=\"attachment_7763\" aria-describedby=\"caption-attachment-7763\" style=\"width: 281px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/file_upload.jpeg\"><img decoding=\"async\" class=\"size-full wp-image-7763\" src=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/file_upload.jpeg\" alt=\"\" width=\"281\" height=\"173\" \/><\/a><figcaption id=\"caption-attachment-7763\" class=\"wp-caption-text\">Visualizzare i file selezionati con Javascript<\/figcaption><\/figure>\n<p style=\"text-align: left;\">Per predisporre la visualizzazione delle informazioni tecniche tramite Js ci viene in aiuto <a title=\"La specifica HTML5 per la gestione dei file\" href=\"http:\/\/www.w3.org\/TR\/FileAPI\/\" target=\"_blank\" rel=\"noopener noreferrer\">la specifica FileAPI di HTML5<\/a>. Avendo il riferimento all&#8217;input per la selezione dei file possiamo accedere all&#8217;oggetto <strong>FileList<\/strong> contenente la lista dei file selezionati: una collezione di oggetti di tipo <strong>File<\/strong>. <a title=\"La definizione dell'oggetto File\" href=\"http:\/\/www.w3.org\/TR\/FileAPI\/#dfn-file\" target=\"_blank\" rel=\"noopener noreferrer\">Le propriet\u00e0 dell&#8217;oggetto File<\/a> sono:<\/p>\n<ol>\n<li><strong>name<\/strong>: il nome del file<\/li>\n<li><strong>type<\/strong>: il mime type del file<\/li>\n<li><strong>size<\/strong>: la dimensione del file in bytes<\/li>\n<\/ol>\n<p>Il codice javascript corrispondente:<\/p>\n<p>[javascript]<br \/>\nfselected: function() {<br \/>\n\tvar fileinfo = &#8221;;<br \/>\n\tvar files = this.element.files;<br \/>\n\tfor (xx=0;xx&lt;files.length;xx++) {<br \/>\n\t\tvar file=files[xx];<br \/>\n \t\tvar fileSize = 0;<br \/>\n \t\tif (file.size &gt; 1024 * 1024)<br \/>\n\t\t\tfileSize = (Math.round(file.size * 100 \/ (1024 * 1024)) \/ 100).toString() + &#8216;MB&#8217;;<br \/>\n\t\telse<br \/>\n\t\t\tfileSize = (Math.round(file.size * 100 \/ 1024) \/ 100).toString() + &#8216;KB&#8217;;<br \/>\n\t\tfileinfo += &quot; &quot; + &#8216;Name: &#8216; + file.name + &#8216;&lt;br \/&gt;Size: &#8216; + fileSize + &#8216;&lt;br \/&gt;Type: &#8216; + file.type + &quot;&quot;;<br \/>\n\t}<br \/>\n\tif (this.fileinfo==undefined)<br \/>\n\t\tthis.fileinfo = new Element(&#8216;div&#8217;,{<br \/>\n\t\t\t&#8216;class&#8217;:&#8217;fileinfo&#8217;<br \/>\n\t\t}).inject(this.element, &#8216;after&#8217;);<br \/>\n\tthis.fileinfo.set(&#8216;html&#8217;,fileinfo);<br \/>\n}<br \/>\n[\/javascript]<\/p>\n<p><em>fselected<\/em> \u00e8 il metodo della classe Js che abbiamo creato per la gestione del form. Per comodit\u00e0 ho utilizzato alcune istruzioni della libreria Mootools che recentemente \u00e8 arrivata alla versione 1.3.2. Questo metodo viene richiamato all&#8217;evento <em>onchange<\/em> dell&#8217;<em>input[type=&#8221;file&#8221;]<\/em> inserito nel nostro form. L&#8217;elemento in questione \u00e8 identificato, nella nostra classe come <em>this.element<\/em>. L&#8217;istruzione <em>this.element.files<\/em> restituisce tutti i file che sono stati selezionati per la suddetta input e ciclando questi dati otteniamo ogni singolo elemento, dal quale recuperare le propriet\u00e0 <strong>name<\/strong>, <strong>size<\/strong> e <strong>type<\/strong>.<\/p>\n<h3>L&#8217;invio del form<\/h3>\n<p>La parte pi\u00f9 interessante della classe Js realizzata \u00e8 quella legata all&#8217;invio del form e la gestione della percentuale di progressione nel caricamento dei dati:<\/p>\n<p>[javascript]<br \/>\nupload: function(e){<br \/>\n\te.stop();<br \/>\n\tvar data = new FormData();<br \/>\n\tvar files = this.element.files;<br \/>\n\tfor (xx=0;xx&lt;files.length;xx++) {<br \/>\n\t\tdata.append(&quot;file[&quot;+xx+&quot;]&quot;, files[xx]);<br \/>\n\t}<br \/>\n\tvar xhr = new XMLHttpRequest();<br \/>\n\txhr.upload.addEventListener(&quot;progress&quot;, this.uploadProgress.bind(this), false);<br \/>\n\txhr.addEventListener(&quot;load&quot;, this.uploadComplete.bind(this), false);<br \/>\n\txhr.addEventListener(&quot;error&quot;, this.uploadFailed.bind(this), false);<br \/>\n\txhr.addEventListener(&quot;abort&quot;, this.uploadCanceled.bind(this), false);<br \/>\n\txhr.open(&quot;POST&quot;, this.url);<br \/>\n\txhr.send(data);<br \/>\n},<br \/>\nuploadProgress: function(evt) {<br \/>\n\tif (evt.lengthComputable) {<br \/>\n\t\tvar percentComplete = Math.round(evt.loaded * 100 \/ evt.total);<br \/>\n\t\tdocument.getElementById(&#8216;progressNumber&#8217;).innerHTML = percentComplete.toString() + &#8216;%&#8217;;<br \/>\n\t}<br \/>\n\telse {<br \/>\n\t\tdocument.getElementById(&#8216;progressNumber&#8217;).innerHTML = &#8216;unable to compute&#8217;;<br \/>\n\t}<br \/>\n},<br \/>\nuploadComplete: function(evt) {<br \/>\n\talert(evt.target.responseText);<br \/>\n},<br \/>\nuploadFailed: function(evt) {<br \/>\n\talert(&quot;Errore durante il caricamento del file.&quot;);<br \/>\n},<br \/>\nuploadCanceled: function(evt) {<br \/>\n\talert(&quot;Upload cancellato dall&#8217;utente oppure connessione interrotta dal browser.&quot;);<br \/>\n}<br \/>\n[\/javascript]<\/p>\n<p>Il metodo upload viene chiamato al click sul input[type=&#8221;submit&#8221;] incluso nel form. La classe FormData istanziata \u00e8 supportata da XMLHttpRequest 2 ed \u00e8 un oggetto utile per definire un elenco di dati definiti secondo lo stile coppia key\/value tramite il metodo append(). Il metodo upload e gli altri da esso richiamati tramite listener per i vari eventi legati al caricamento sono semplici e di comprensione intuitiva.<br \/>\nMenzione va fatta per la gestione dell&#8217;indicatore di progressione dell&#8217;invio applicato all&#8217;evento <em>progress<\/em> e che, tramite i valori <em>loaded<\/em> e <em>total<\/em> offerti dall&#8217;evento passato al metodo <em>uploadProgress<\/em>. Questi valori ci dicono la quantit\u00e0 di informazioni caricate rispetto a quelle totali da inviare tramite il form: cos\u00ec \u00e8 possibile gestire il valore per tracciare la percentuale del caricamento in vari modi, come barra di caricamento o semplice percentuale stampata.<\/p>\n<figure id=\"attachment_7776\" aria-describedby=\"caption-attachment-7776\" style=\"width: 266px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/file_upload_progress.jpeg\"><img decoding=\"async\" class=\"size-full wp-image-7776\" src=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/file_upload_progress.jpeg\" alt=\"\" width=\"266\" height=\"176\" \/><\/a><figcaption id=\"caption-attachment-7776\" class=\"wp-caption-text\">Il form in caricamento con la percentuale di caricamento<\/figcaption><\/figure>\n<p>Cliccando qui \u00e8 possibile scaricare la classe realizzata che richiede il <a href=\"http:\/\/mootools.net\/download\" target=\"_blank\" rel=\"noopener noreferrer\">caricamento di Mootools 1.3.2<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" class=\"alignleft size-full wp-image-7803\" title=\"html5-upload\" src=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png\" alt=\"\" width=\"160\" height=\"160\" \/><strong>L&#8217;upload di file<\/strong> tramite pagine web come, ad esempio, il caricamento degli allegati ad una email, oppure le immagini da caricare in una gallery, ecc&#8230;, \u00e8 spesso tra i pensieri di molti <strong>web developers<\/strong>. Durante i primi anni del web, l&#8217;upload di file era gestito semplicemente da un form inviato ad un&#8217;altra pagina web: il browser ricaricava completamente la pagina impostata nell&#8217;action del form. Questo metodo andava, e va ancora, bene per siti semplici o istituzionali nei quali l&#8217;invio di form non \u00e8 l&#8217;aspetto essenziale a livello quantitativo per le prestazioni del software. Vediamo qualcosa pi\u00f9 sofisticato e moderno, adatto per \u00a0web applications<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","footnotes":""},"categories":[108],"tags":[132,106],"class_list":["post-7726","post","type-post","status-publish","format-standard","hentry","category-sviluppo","tag-html","tag-html5"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera<\/title>\n<meta name=\"description\" content=\"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera\" \/>\n<meta property=\"og:description\" content=\"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/\" \/>\n<meta property=\"og:site_name\" content=\"Artera\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/artera.net\/\" \/>\n<meta property=\"article:published_time\" content=\"2011-07-01T12:47:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-27T14:48:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png\" \/>\n<meta name=\"author\" content=\"Sergio Ravera\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sergio Ravera\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/\"},\"author\":{\"name\":\"Sergio Ravera\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#\\\/schema\\\/person\\\/48ffb6b3727677643fbfd3ecf0a10aa0\"},\"headline\":\"HTML5 &#8211; Upload di file con XMLHttpRequest 2\",\"datePublished\":\"2011-07-01T12:47:40+00:00\",\"dateModified\":\"2023-02-27T14:48:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/\"},\"wordCount\":1035,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2011\\\/07\\\/html5-upload.png\",\"keywords\":[\"HTML\",\"html5\"],\"articleSection\":[\"Sviluppo\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/\",\"url\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/\",\"name\":\"\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2011\\\/07\\\/html5-upload.png\",\"datePublished\":\"2011-07-01T12:47:40+00:00\",\"dateModified\":\"2023-02-27T14:48:55+00:00\",\"description\":\"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2011\\\/07\\\/html5-upload.png\",\"contentUrl\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2011\\\/07\\\/html5-upload.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/sviluppo\\\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.artera.net\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTML5 &#8211; Upload di file con XMLHttpRequest 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/www.artera.net\\\/it\\\/\",\"name\":\"Artera\",\"description\":\"Swiss Premium Hosting\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.artera.net\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#organization\",\"name\":\"Artera\",\"url\":\"https:\\\/\\\/www.artera.net\\\/it\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/artera-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.artera.net\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/artera-logo.png\",\"width\":300,\"height\":77,\"caption\":\"Artera\"},\"image\":{\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/artera.net\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/artera\\\/\",\"https:\\\/\\\/www.instagram.com\\\/artera_swiss\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.artera.net\\\/it\\\/#\\\/schema\\\/person\\\/48ffb6b3727677643fbfd3ecf0a10aa0\",\"name\":\"Sergio Ravera\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g\",\"caption\":\"Sergio Ravera\"},\"description\":\"Raised in a family tradition of merchants, my entrepreneurial spirit drove me to launch my first e-commerce venture in 1998. My vision and dedication led, in 2002, to the founding of Artera, now a leading brand in premium managed cloud hosting services. As Chief Executive Officer, I lead DHH Switzerland SA, part of the international DHH S.p.A. group, listed on the Milan Stock Exchange with the reference code (AIM \u2013 ISIN: IT0005203622). It is under this brand that the Artera brand continues to grow and thrive. In addition to my commitment to the business world, I am an active researcher in the field of new technologies, always fascinated by cutting-edge innovations in the industry.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/sergioravera\\\/\"],\"url\":\"https:\\\/\\\/www.artera.net\\\/it\\\/author\\\/sergio-ravera\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera","description":"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/","og_locale":"it_IT","og_type":"article","og_title":"\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera","og_description":"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.","og_url":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/","og_site_name":"Artera","article_publisher":"https:\/\/www.facebook.com\/artera.net\/","article_published_time":"2011-07-01T12:47:40+00:00","article_modified_time":"2023-02-27T14:48:55+00:00","og_image":[{"url":"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png","type":"","width":"","height":""}],"author":"Sergio Ravera","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Sergio Ravera","Tempo di lettura stimato":"5 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#article","isPartOf":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/"},"author":{"name":"Sergio Ravera","@id":"https:\/\/www.artera.net\/it\/#\/schema\/person\/48ffb6b3727677643fbfd3ecf0a10aa0"},"headline":"HTML5 &#8211; Upload di file con XMLHttpRequest 2","datePublished":"2011-07-01T12:47:40+00:00","dateModified":"2023-02-27T14:48:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/"},"wordCount":1035,"commentCount":0,"publisher":{"@id":"https:\/\/www.artera.net\/it\/#organization"},"image":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png","keywords":["HTML","html5"],"articleSection":["Sviluppo"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/","url":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/","name":"\u2022 HTML5 - Upload di file con XMLHttpRequest 2 - Artera","isPartOf":{"@id":"https:\/\/www.artera.net\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#primaryimage"},"image":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png","datePublished":"2011-07-01T12:47:40+00:00","dateModified":"2023-02-27T14:48:55+00:00","description":"Leggi dal blog: HTML5 - Upload di file con XMLHttpRequest 2. Contattaci per una partnership! Artera Swiss Premium Hosting news, articoli e notizie interessanti dal mondo digitale.","breadcrumb":{"@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#primaryimage","url":"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png","contentUrl":"https:\/\/www.artera.net\/wp-content\/uploads\/2011\/07\/html5-upload.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.artera.net\/it\/sviluppo\/html5-upload-di-file-piu-pulito-con-xmlhttprequest2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.artera.net\/it\/"},{"@type":"ListItem","position":2,"name":"HTML5 &#8211; Upload di file con XMLHttpRequest 2"}]},{"@type":"WebSite","@id":"https:\/\/www.artera.net\/it\/#website","url":"https:\/\/www.artera.net\/it\/","name":"Artera","description":"Swiss Premium Hosting","publisher":{"@id":"https:\/\/www.artera.net\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.artera.net\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/www.artera.net\/it\/#organization","name":"Artera","url":"https:\/\/www.artera.net\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.artera.net\/it\/#\/schema\/logo\/image\/","url":"https:\/\/www.artera.net\/wp-content\/uploads\/2019\/09\/artera-logo.png","contentUrl":"https:\/\/www.artera.net\/wp-content\/uploads\/2019\/09\/artera-logo.png","width":300,"height":77,"caption":"Artera"},"image":{"@id":"https:\/\/www.artera.net\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/artera.net\/","https:\/\/www.linkedin.com\/company\/artera\/","https:\/\/www.instagram.com\/artera_swiss\/"]},{"@type":"Person","@id":"https:\/\/www.artera.net\/it\/#\/schema\/person\/48ffb6b3727677643fbfd3ecf0a10aa0","name":"Sergio Ravera","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/618f2c20338bb422bd317eae8d6c9c097ba85d3f5a1da18e21ecf5da5ee3a448?s=96&d=mm&r=g","caption":"Sergio Ravera"},"description":"Raised in a family tradition of merchants, my entrepreneurial spirit drove me to launch my first e-commerce venture in 1998. My vision and dedication led, in 2002, to the founding of Artera, now a leading brand in premium managed cloud hosting services. As Chief Executive Officer, I lead DHH Switzerland SA, part of the international DHH S.p.A. group, listed on the Milan Stock Exchange with the reference code (AIM \u2013 ISIN: IT0005203622). It is under this brand that the Artera brand continues to grow and thrive. In addition to my commitment to the business world, I am an active researcher in the field of new technologies, always fascinated by cutting-edge innovations in the industry.","sameAs":["https:\/\/www.linkedin.com\/in\/sergioravera\/"],"url":"https:\/\/www.artera.net\/it\/author\/sergio-ravera\/"}]}},"_links":{"self":[{"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/posts\/7726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/comments?post=7726"}],"version-history":[{"count":8,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/posts\/7726\/revisions"}],"predecessor-version":[{"id":217804,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/posts\/7726\/revisions\/217804"}],"wp:attachment":[{"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/media?parent=7726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/categories?post=7726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.artera.net\/it\/wp-json\/wp\/v2\/tags?post=7726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}