Come utilizzare Amazon S3 e PHP per archiviare e gestire dinamicamente i file con facilità

Un paio di settimane fa, Nettuts + ha pubblicato un tutorial introduttivo sull'uso del Simple Storage System (S3) di Amazon. Essere in grado di caricare un numero illimitato di file per quasi tutti i soldi è fantastico, ma sarebbe ancora meglio se i tuoi utenti potessero caricare file dal tuo sito web. In questo modo non dovresti preoccuparti della dimensione del tuo server web per un secondo. Proviamo!

Fondamentalmente quello che andremo a fare è usare un elemento file HTML standard e una classe PHP S3 facile da usare per creare una pagina in cui le persone possono caricare un file sul tuo account S3 e ottenere informazioni sui file che sono già stati caricati. Per questo avrete bisogno di un account Amazon S3 e di un server web abilitato PHP. Se non hai sentito parlare di Amazon S3, o non hai ancora un account, leggi prima Tutorial introduttivo S3 di Collis.

Passo 1

Ora, la prima cosa di cui avremo bisogno è un modo per PHP di comunicare con il server S3. Donovan Schonknecht ha scritto una classe PHP per questo, quindi piuttosto che provare a reinventare la ruota, lo useremo!

  1. Scarica l'ultima versione beta (0.2.3) '
  2. Estrai il file .rar e copia il file S3.php in una nuova cartella. Il file contiene anche un readme e alcuni esempi, ma non li useremo.
  3. Apri il file S3.php e dai un'occhiata solo per vedere tutto il lavoro che non farai da solo grazie a questa lezione! :-)

Passo 2

Quindi, crea un nuovo file chiamato page.php nella stessa cartella. La prima cosa che dovremo fare è includere il file S3.php. Useremo la funzione require_once () in php. Questa funzione includerà il file solo se non è stato incluso prima nella stessa pagina. Questo per assicurarci che non avremo problemi con ridefinizioni di funzioni quando accidentalmente lo script tenta di includere il file una seconda volta.

Successivamente, dovremo inserire le informazioni di accesso di Amazon Web Services (AWS) che lo script deve accedere al nostro server S3. Queste sono la chiave di accesso e la chiave segreta fornita da Amazon (di nuovo, se non sai di cosa sto parlando vedi il tutorial introduttivo di NETTUTS). Ora abbiamo tutte le informazioni necessarie per iniziare la lezione. Questo codice è stato inserito nella parte superiore del corpo tag.

 

Passaggio 3

Ora creiamo un semplice modulo html con un elemento file in esso. Questo elemento consente agli utenti di esplorare il proprio disco locale per un file. Quando l'utente preme il pulsante di invio, il file verrà automaticamente caricato come file temporaneo sul server e le informazioni sul file verranno inviate nella variabile POST.

Ecco lo snippet di codice. Assicurati di non dimenticare enctype = "multipart / form-data" che è necessario affinché l'elemento file funzioni. Questo codice deve essere posizionato all'esterno di tag, poiché è HTML.

 

Passaggio 4

Ora, per quelli unfamilliar con le forme, action = "" dice allo script a quale pagina andare dopo averlo inviato. Poiché abbiamo specificato una stringa vuota, il modulo pubblicherà le variabili e aggiornerà la pagina corrente. Quindi, quando la pagina viene caricata, vorremmo controllare se è stato inviato o meno un modulo. Quando è stato inviato un modulo, la pagina dovrebbe eseguire lo script che recupera le variabili del post e si occupa dello spostamento dei file sul server S3.

La variabile post inviata dall'elemento file è una matrice, contenente informazioni sul file. Ad esempio: nomefile, dimensione, tipo e nome temporaneo. Tutto ciò di cui abbiamo bisogno è il nome file e il nome temporaneo. Nota che, a differenza di altri elementi del modulo, l'elemento file invierà le variabili $ _FILES e non a $ _POST.

Il codice PHP sotto controlla se un modulo è stato inviato e recupera le variabili post. Ci occuperemo del server S3 in seguito. Questo codice dovrebbe essere posizionato subito dopo il punto in cui è stata avviata la classe s3.

 // controlla se è stato inviato un modulo if (isset ($ _ POST ['Submit'])) // recupera variabili post $ fileName = $ _FILES ['theFile'] ['name']; $ fileTempName = $ _FILES ['theFile'] ['tmp_name']; // continueremo il nostro script da qui al prossimo passaggio! 

Passaggio 5

Ok, ora abbiamo un modulo che invia un file temporaneo al server e ti lascia alcune informazioni. Se lo desideri, puoi caricare il file su un server e testarlo. Noterai che è necessario del tempo per elaborare il modulo, poiché in effetti sta caricando un file. Ad ogni modo, non vedrai il file apparire in nessun punto del tuo server perché è stato memorizzato solo come file temporaneo. Tutto ciò che resta da fare è spostare il file caricato in un bucket. Per prima cosa creeremo un nuovo bucket e quindi sposteremo il file in quel bucket.

Per creare un secchio useremo la funzione putBucket (bucket, acl) in cui 'bucket' è il nome del bucket (parola di Amazon per la tua cartella principale o directory di file). Il secondo argomento è l'ACL (Access Control List) in cui è possibile definire chi può e chi non può leggere o scrivere in questo bucket. Vogliamo che chiunque sia in grado di leggere i nostri file, quindi useremo S3 :: ACL_PUBLIC_READ. Nota che un bucket deve essere creato solo una volta, quindi ogni volta che viene eseguito questo script questa funzione non farà nulla, poiché il bucket esiste già.

Per spostare il file useremo la funzione putObjectFile (sourcefile, bucket, newfilename, acl).Il file sorgente è il percorso del file che vogliamo spostare, quindi nel nostro caso è il file temporaneo che è stato caricato tramite il nostro modulo. Bucket è il bucket in cui spostare il file, che sarà il bucket che abbiamo appena creato. Newfilename è il nome del file che il file otterrà nel bucket. In questo tutorial utilizzeremo lo stesso nome file sull'unità locale, ma in alcuni casi potresti voler cambiare il nome del file. Acl è di nuovo l'Elenco di controllo di accesso, che verrà impostato nuovamente su S3 :: ACL_PUBLIC_READ.

 // crea un nuovo bucket $ s3-> putBucket ("jurgens-nettuts-tutorial", S3 :: ACL_PUBLIC_READ);

// sposta il file if ($ s3-> putObjectFile ($ fileTempName, "jurgens-nettuts-tutorial", $ fileName, S3 :: ACL_PUBLIC_READ)) echo "Il file è stato caricato con successo."; else echo "Qualcosa è andato storto durante il caricamento del file ... mi dispiace.";

Passaggio 6

Ora quando selezioni un file e premi "Carica", il file verrà archiviato sul server Amazon. Puoi già visualizzarlo inserendo un URL simile a questo: http: //yourbucketname.s3.amazoneaws.com/yourfile.ext

Per il tocco finale desideriamo che lo script generi un elenco di file nel bucket. Per questo useremo la funzione getBucket (secchio), in cui il secchio è il secchio che vogliamo produrre. Questa funzione restituisce un array con informazioni sui file. Ogni restituito come una matrice, anche. Per visualizzare:

Vogliamo generare tutti i file nell'array $ bucket_contents. Per questo useremo a per ciascuno() loop che passerà attraverso l'array fino a quando tutti gli elementi sono stati elaborati. Memorizzerà l'elemento corrente nella variabile $ file ed eseguirà il codice tra parentesi. Tutto quello che dobbiamo fare ora è echo un link al file.

Inserisci questo codice sotto il modulo per visualizzare l'elenco lì.

 getBucket ( "Jurgens-Nettuts dimostrativi"); foreach ($ bucket_contents as $ file) $ fname = $ file ['name']; $ furl = "http://jurgens-nettuts-tutorial.s3.amazonaws.com/".$fname; // mostra un link al file echo "$ fname
";?>

Con un po 'di stile CSS, il tuo risultato finale potrebbe essere simile a questo:

Finito!

Quindi ecco, lo script di upload di file illimitato. Naturalmente c'è molto di più che puoi fare con la classe PHP S3. Basta dare una rapida occhiata al suo file readme e sarai a posto. È davvero facile da usare!

Scarica i file sorgente

Guarda una demo