Creare una galleria fotografica con il Cloud Storage di Hostingsolutions.it – parte 8

In questa puntata mostreremo come avviene il collegamento fra la nostra applicazione Photocloud e il cloud storage di Hostingsolutions.

Photocloud & GitHub

Nelle prime puntate vi abbiamo promesso che il progetto sarebbe diventato open source, abbiamo quindi creato un repository su GitHub, un’organizzazione fra le più attive nell’ospitare progetti open source (e non solo). Il repository si trova a questo indirizzo:
https://github.com/megadix/photocloud

Al suo interno potete trovare tutti i sorgenti dell’applicazione, oltre che tutti i servizi di gestione forniti da GitHub:

  • possibilità di scaricare un archivio con l’ultima versione dei sorgenti, senza dover installare Git;
  • gestione degli issue (segnalazioni o trouble ticket);
  • collaborazione al progetto: clonazione del repository, pull request, eccetera;
  • statistiche, wiki, …

Insomma un vero e proprio sistema integrato per la gestione di progetti software, anche quelli più complessi. Se siete già registrati su GitHub potrete anche “osservare” (funzione watch) un progetto, per essere notificati su commit e news dal team di sviluppo.

Facciamo notare infine come un (benefico) effetto collaterale del nuovo repository sia il fatto che potremmo alleggerire un po’ i nostri articoli, evitando ad esempio di inserire sorgenti, file di configurazione e risorse e limitandoci a fornire il link a GitHub.

Integrazione con Cloud Storage

Vediamo ora quali scelte abbiamo fatto per l’implementazione delle funzionalità di back office.

Innanzi tutto per la comunicazione con il servizio di storage abbiamo deciso di utilizzare la libreria S3.php creata da Donovan Schonknecht. Questa classe si occupa di gestire tutte le chiamate di tipo REST ai web services compatibili con le S3 API di Amazon. I servizi di Hostingsolutions.it sono conformi a questo standard, inoltre sul sito dell’azienda stessa ci sono alcune guide pratiche per l’integrazione di S3 API su piattaforme Java e PHP:
Guide ed esempi di programmazione per l’utilizzo
dei servizi Cloud Storage

Nella pagine dedicate a PHP viene fatto uso proprio della classe S3.php, quindi se avete bisogno di un approfondimento sono caldamente consigliate!

Per utilizzare una classe come libreria all’interno di CodeIgniter è necessario avere una classe dotata di un costruttore con un unico argomento di tipo array associativo; nel nostro caso ciò rappresenta un problema, perché la classe S3.php (come molte altre librerie, d’altronde) ha vari argomenti nel costruttore! Per risolvere la situazione abbiamo realizzato, grazie anche ai preziosi consigli dell’autore stesso, una classe wrapper, da salvare in application/libraries/S3_CI.php:

<?php

require 'S3.php';

/**
 * Wrapper for Amazon S3 PHP class by by Donovan Schonknecht
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 */
class S3_CI extends S3
{
    public function __construct($params) {
        parent::__construct($params['accessKey'], $params['secretKey'],
            $params['useSSL'], $params['endpoint']);
    }
}

 

Nella stessa directory dobbiamo copiare anche la libreria S3.php. Fatto ciò, saremo in grado di utilizzarla all’interno dell’applicazione, caricandola come library di CodeIgniter. Ecco come viene utilizzata all’interno del metodo __construct() del controller Admin, che abbiamo iniziato a realizzare nella scorsa puntata:

$params = array(
  'accessKey' => $this->config->item('storage_accessKey'),
  'secretKey' => $this->config->item('storage_secretKey'),
  'useSSL' => $this->config->item('storage_useSSL'),
  'endpoint' => $this->config->item('storage_endpoint')
);
$this->load->library('s3_ci', $params);

 

Le voci ‘storage_accessKey’, ‘storage_secretKey’ eccetera spono memorizzate in un nuovo file di configurazione, ovvero application/config/cloud_storage.php:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['storage_accessKey'] = 'CHIAVE_DI_ACCESSO';
$config['storage_secretKey'] = 'CHIAVE_SEGRETA';
$config['storage_useSSL'] = false;

$config['storage_endpoint'] = 'rm1.cloudaccess.it';

$config['storage_bucket_name'] = 'NOME_BUCKET';
$config['storage_base_path'] = 'PATH_DI_BASE';

 

Ecco il significato delle varie voci:

  • CHIAVE_DI_ACCESSO, CHIAVE_SEGRETA e NOME_BUCKET sono fornite all’attivazione del servizio;
  • PATH_DI_BASE è il nome della directory, all’interno del bucket, dove verranno memorizzate le foto.

Avere un path di base ci permette di poter memorizzare all’interno del bucket le risorse di molte altre applicazioni in contemporanea, non solo di Photocloud.

A questo punto il controller è pronto per utilizzare S3.php per caricare le immagini sul cloud storage. In realtà il codice per eseguire queste è molto semplice, si tratta solo di:

    • creare gli oggetti da caricare, tramite il metodo S3::inputFile();
    • eseguire l’upload sullo storage con il metodo S3::putObject()

.

Per i dettagli vi rimandiamo alle già citate guide e al sorgente di admin.php su GitHub.

Upload di immagini

CodeIgniter possiede alcuni strumenti per la gestione degli upload di file:

  • la libreria upload;
  • alcune funzioni nel form helper.

La libreria upload viene inizializzata allo stesso modo di S3 come visto sopra, ovvero viene passato un array come secondo parametro di $this->load->library():

$uploadConfig = array(
  'upload_path' => './uploads/',
  'allowed_types' => 'jpg',
  'max_size' => 10000
);
$this->load->library('upload', $uploadConfig);

 

Una volta fatto l’upload, le immagini vengono ridimensionate con la libreria GD2 ad un formato standard di 600 pixel di larghezza, inoltre viene creata una miniatura (chiamata thumbnail) di 260 pixel di larghezza. Il codice che esegue queste operazioni è piuttosto lungo e complicato, rimandiamo ancora una volta al sorgente per i dettagli (metodo image_add_post()).

In conclusione

Questa serie, per il momento, termina qui. Grazie a tecnologie intelligenti come il cloud storage siamo stati in grado di creare un’applicazione assolutamente non banale, ottimamente performante, sicura. Aggiungerei anche flessibile ed economica, perché grazie ad esso Photocloud può girare su hosting condivisi e molto economici, demandando il carico di banda e spazio al fornitore di storage. Ma le possibilità sono molte, sta a noi conoscere gli strumenti e utilizzarli al meglio!

Links