File upload in Ajax

Con questo breve tutorial vedremo come realizzare un elementare sistema di file upload usando PHP e Ajax.
A dire la verità non è possibile realizzare un sistema di file-upload in Ajax puro a causa delle limitazioni di Javascript (su cui si basa Ajax) in campo di sicurezza.
La soluzione è quella di simulare l’effetto asincrono tramite un iframe.

Abbiamo quindi bisogno di:

  • Un form HTML
  • Un javascript che esegua una animazione, chiamato al submit del form.
  • Uno script PHP che esegua l’upload vero e proprio
  • Un iframe invisibile nella stessa pagina del form

Il form HTML è davvero semplice, c’è un campo per la scelta del file e un bottone.
Da notare il parametro enctype che indica il tipo di codifica.

<form action="upload.php" enctype="multipart/form-data" method="post"> File: <input name="myfile" type="file" />
<input name="submitBtn" type="submit" value="Upload" />
</form>

A questa pagina c’è da aggiungere un blocco che mostrerà l’animazione durante l’upload e per dare la conferma all’utente che l’operazione è riuscita. Inoltre, come già detto, aggiungiamo un iframe invisibie da usare come target del form.

<p id="f1_upload_process">Loading...
<img src="loader.gif" alt="" /></p>
<p id="result"></p>
<form action="upload.php" enctype="multipart/form-data" method="post"> File: <input name="myfile" type="file" />
<input name="submitBtn" type="submit" value="Upload" />
</form>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

Scriviamo adesso la semplice funzione javascript che rende il blocco contenente l’animazione visibile sulla pagina.

      function startUpload(){
      document.getElementById('f1_upload_process').style.visibility = 'visible';
      return true;
      }

E di riflesso scriviamo anche la funzione che verrà chiamata al termine del processo per mostrare un messaggio all’utente e fermare l’animazione.

      function stopUpload(success){
      var result = '';
      if (success == 1){
      document.getElementById('result').innerHTML =
      '<span class="msg">The file was uploaded successfully!< \/span><br /><br />';
      }
      else {
      document.getElementById('result').innerHTML =
      '<span class="emsg">There was an error during file upload!< \/span><br /><br />';
      }
      document.getElementById('f1_upload_process').style.visibility = 'hidden';
      return true;
      }
</span></span>

Visto che ci siamo diamo un po’ di stile al nostro form con qualche regola CSS

      #f1_upload_process{
      z-index:100;
      position:absolute;
      visibility:hidden;
      text-align:center;
      width:400px;
      margin:0px;
      padding:0px;
      background-color:#fff;
      border:1px solid #ccc;
      }
 
      form{
      text-align:center;
      width:390px;
      margin:0px;
      padding:5px;
      background-color:#fff;
      border:1px solid #ccc;
      }

Ora passiamo alla parte server.
Dovrebbe essere abbastanza semplice da capire, spieghiamo comunque qualcosa. Prima di tutto andiamo a settare il percorso di destinazione del file. Poi introduciamo una variabile che ci conterrà l’eventuale errore in fase di upload del file.
Procediamo quindi a spostare il file dalla directory temporanea alla sua destinazione finale.
Il codice PHP dovrebbe essere una cosa del genere

< ?php
$destination_path = getcwd().DIRECTORY_SEPARATOR;
$result = 0;
$target_path = $destination_path . basename( $_FILES['myfile']['name']);
if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $target_path)) {
$result = 1;
}
sleep(1);
?>

Come visto nelle proprietà del form il codice PHP verrà eseguito all’interno dell’iframe nascosto. A questo punto non ci rimane che aggiungere al suo interno il codice js che chiamerà la funzione scritta precedentemente e che notificherà l’utente se l’upload è andato a buone fine o meno

      <script language="javascript" type="text/javascript">
      window.top.window.stopUpload(< ?php echo $result; ?>);
      </script>

Cosa vi avevo detto? Facile e veloce.
Se vi siete persi qualche passaggio o non vi è del tutto chiaro il funzionamento, se volete farmi i complimenti o mandarmi a cag*re, se volete invitarmi a cena fuori fatelo pure nei commenti.

Ping this!

Come si fa a non amarla!

Ditemi come si fa a non amare questa donna.
Una donna che mi chiama uomo
Una donna che sulle pagine del suo letterario blog organizza una mozione popolare a favore del sottoscritto.
Una donna che mi giudica interessante
Una donna che mi appioppa un bel meme
Una donna che vuole assomigliare a Bridget Jones
Una donna che mi paracula (in modo sottile) dicendo che la mia intelligenza si vede dagli occhi
Ma soprattutto una donna a cui piacciono la birra e il mojito!!!
Davvero, datemi un motivo per non farlo.

Tag Technorati: , ,

Ping this!

Io ce l’ho più lungo… il Feed!

Aspettando il 18 luglio è per ora possibile misurare la propria popolarità nella blogosfera con altri servizi e secondo diversi fattori.
Probabilmente il numero di iscritti al feed RSS di un blog non è una metrica molto accurata, ma almeno da qualche indizio.
FeedCompare è una semplice webapp che confronta, basandosi sui dati di Feedburner, l’andamento delle iscrizioni per un massimo di 4 siti in un arco di tempo a scelta tra 1 e 24 mesi.
Il risultato è un grafico in flash che al passaggio del mouse ci fa vedere gli iscritti in quel giorno e facendo drag’n'drop sulla timeline ci zoomma i dati per quel periodo.
Le funzionalità sembrano finire qua, semplice ed efficace.

Via Mashable

Tag Technorati: , , , ,

Ping this!

Meme: due personaggi di cui ti innamoreresti

Per iniziare bene la settimana Mary mi nomina per proseguire il suo meme.
Il meme è questo: “indicate due personaggi, uno letterario ed uno cinematografico, di cui potreste innamorarvi“.

Mi sembra di aver capito che i personaggi debbano essere donne e devo dire che la cosa mi crea un po’ di difficoltà, non perchè non mi piacciano le donne ma perchè solitamente i “bei personaggi” sono maschi o meglio tra i personaggi maschi c’è più scelta (ok la finisco di fare il maschilista).
Forse sarò banale intanto vediamo di iniziare, nella scelta del personaggio letterario ho trovato qualche difficoltà, passando da Hermione di Harry Potter alla Maria di 11 Minuti di Paulo Coelho, da Madame Bovary ad Alice nel paese delle Meraviglie ma alla fine ho deciso per Bridget Jones e la sua irresistibile, quanto involontaria comicità.

Personaggio cinematografico, il dubbio è tra Selene di Underworld (eh, non quella che avete capito voi), Trinity di Matrix, Sara Thomas di Serendipity (interpretata sempre da Kate Beckinsale, la vampira di Underworld) anche qui tutti personaggi molto diversi tra di loro come potete notare… ma la mia scelta definitiva cade sulla Sposa, Beatrix Kiddo, nella “saga” di Kill Bill.
La scelta è forse un po’ viziata dalla bellezza fascino di Uma Thurman, ma in quel ruolo in quel film mi ha fatto letteralmente innamorare di lei (ahimè Pulp Fiction l’ho visto solo dopo)

Alla fine ho scelto due personaggi completamente diversi, due bellezze non proprio canoniche. Come si dice: non è bello ciò che è bello ma è bello ciò che brilla (cit.).
Ora mi tocca rilanciare il meme ad un maschietto ed ad una femminuccia, quindi sono proprio curioso di vedere cosa risponderanno Tencar e Scaccoallaregina Serenella

Ping this!

One million $ question

In tutta sincerità, se io scrivessi un post serio sulla riapertura di BlogBabel voi continuereste a leggermi?

Forse meglio impegnarmi a scrivere di più…

Technorati Tags:

Ping this!
Text Link Ads