Storage OnLine: Utilizzare API S3 con PHP per leggere i dati
Abbiamo già introdotto l'utilizzo delle S3 API in PHP; questa guida tratta dell'utilizzo della stessa libreria per leggere i dati dallo Storage OnLine, creando una sorta di file browser semplificato.
Struttura del file system
Le soluzioni di Storage OnLine, per poter garantire le performance e la sicurezza che li caratterizzano, hanno dovuto semplificare la struttura del file system, adottando i concetti di bucket/oggetti ed eliminando le struttura ricorsiva delle directory.
Il funzionamento è molto semplice: i bucket sono i contenitori di più alto livello e al loro interno vengono memorizzati gli oggetti, ognuno con un nome univoco (all'interno dello stesso bucket). Solitamente i bucket sono associati ad una singola applicazione o utente, per suddividere in modo netto lo spazio di storage. Affinchè si possa vedere una struttura ad albero come quella delle cartelle directory è l'utilizzo dei cosiddetti delimitatori, solitamente il carattere "/", all'interno del nome dell'oggetto.
Un file browser in PHP
Di seguito il codice PHP per leggere i contenuti del bucket sullo Storage OnLine. Nella cartella dello spazio web, creare due sotto-cartelle: conf e lib. In quest'ultima quindi copiare il file S3.php, ovvero la libreria PHP per accedere allo storage. In conf creiamo invece il file configuration.php:
<?php require_once 'lib/S3.php'; define('s3AccessKey', 'USERNAME'); define('s3SecretKey', 'PASSWORD'); define('s3EndPoint', 'ACCESSO_S3'); $s3 = new S3(s3AccessKey, s3SecretKey); $s3->setExceptions(true); $s3->setEndpoint(s3EndPoint); $s3->setSSL(true, false); ?>
dove USERNAME, PASSWORD E ACCESSO_S3 sono i valori che vengono mostrati nella pagina di attivazione del protocollo S3 da pannello di controllo e che vengono forniti anche nella email che segue l'attivazione del servizio.
Creare, quindi, il file index.php nella root dello spazio web:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <?php try { require_once 'conf/configuration.php'; $buckets = $s3->listBuckets(); } catch(Exception $ex) { $errorMessage = "Si è verificato un errore (" . $ex->getCode() . "):\n" . $ex->getMessage(); $errorMessage = nl2br(htmlspecialchars($errorMessage, ENT_NOQUOTES, 'UTF-8')); } ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>S3 API test</title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <?php if (isset($errorMessage)) { ?> <div class="errorMessage"> <?php echo $errorMessage; ?> </div> <?php } else { ?> <h3>Elenco bucket</h3> <ul> <?php foreach($buckets as $bucket) { $url = "listObjects.php?bucketName=$bucket"; ?> <li><?php echo '<a href="' . $url . '">' . $bucket . '</a>'; ?></li> <?php } ?> </ul> <?php } ?> </body>
Questa pagina si collega all'account di storage ed effettua l'elenco dei bucket (solitamente uno), aggiungendo un link alla pagina listObjects.php, utilizzata per mostrare i contenuti del bucket. Ecco il sorgente della pagina:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <?php try { // configurazione require_once 'conf/configuration.php'; // azioni $bucketName = $_REQUEST['bucketName']; $prefix = isset($_REQUEST['prefix']) ? $_REQUEST['prefix'] : ''; $contents = $s3->getBucket($bucketName, $prefix); } catch(Exception $ex) { $errorMessage = "Si è verificato un errore (" . $ex->getCode() . "):\n" . $ex->getMessage(); $errorMessage = nl2br(htmlspecialchars($errorMessage, ENT_NOQUOTES, 'UTF-8')); } ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>S3 API test</title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <?php if (isset($errorMessage)) { ?> <div class="errorMessage"> <?php echo $errorMessage; ?> </div> <?php } else { ?> <h3>Elenco oggetti del bucket: <em><?php echo htmlspecialchars($bucketName, ENT_NOQUOTES, 'UTF-8');?></em></h3> <p><a href="index.php">Elenco bucket</a></p> <form method="post" action="listObjects.php"> <input name="bucketName" type="hidden" value="<?php echo htmlspecialchars($bucketName, ENT_NOQUOTES, 'UTF-8');?>"/> <input name="prefix" value="<?php echo htmlspecialchars($prefix, ENT_NOQUOTES, 'UTF-8');?>" /> <button type="submit">Filtra</button> </form> <ul> <?php foreach ($contents as $object) { $name = htmlspecialchars($object['name'], ENT_NOQUOTES, 'UTF-8'); echo "<li>$name</li>"; } ?> </ul> <?php } ?> </body>
Questa pagina ci permette anche di filtrare il nome degli oggetti, ecco un esempio, senza filtri:
e con il filtro "foto":
L'elenco degli oggetti è creato dalla chiamata al metodo getBucket().
Infine, salvare anche il file style.css nella stessa directory di index.php:
div.errorMessage { background: #ffffcc; border: 2px solid red; padding: 3px; }
Ora, un ultimo accorgimento molto importante per la sicurezza. Se si usa il web server Apache e le direttive .htaccess sono abilitate, salvare nelle cartella lib e conf un file .htaccess con questa riga:
deny from all
Questa operazione è molto importante, perchè impedisce che la configurazione (con relativa chiave segreta) sia leggibile da non autorizzati.