Blog

Lo storage dei file con AWS S3

Storage dei file con AWS S3

Normalmente lo storage di file, siano questi allegati di Attachments Tables, file immagine caricati tramite widget immagine, o altri file (es: video) caricati con un dropUploader, avviene sullo stesso server su cui si trova la nostra istanza, generalmente a un path indicato all’interno della cartella site.

In alcuni casi può essere però preferibile separare lo storage di questi file dal server su cui viene eseguita l’istanza, per esigenze di performance, di più semplice backup e disponibilità dei dati, di condivisione con altri software, ecc.

Una delle soluzioni a disposizione, integrato direttamente in Genropy tramite un service dedicato, sono i bucket S3 di Amazon AWS. Sarà infatti sufficiente configurare il servizio e aggiornare i path dove viene effettuato l’upload per utilizzare questo sistema di storage parallelamente al server su cui viene eseguita la nostra istanza.

Vediamo quindi innanzitutto come configurare il servizio nella documentazione dedicata:


S3 e upload dei file

L’upload dei file può avvenire in diversi modi, ma quale che sia il metodo utilizzato sarà sempre necessario modificare la directory di destinazione nella forma nomedelservice:nomedellacartella.

Se quindi stiamo utilizzando dei widget img, sarà sufficiente modificare l’upload_folder come segue:

fb.img(src='^.image', crop_width='320px', crop_height='168px', edit=True, upload_filename='=#FORM.record.id', upload_folder='candidati:foto')

Se invece utilizziamo il dropUploader modificheremo l’uploadPath:

cp.dropUploader(height='168px', width='320px', uploadPath='social:video', filename='=#FORM.record.id')

Quale che sia il metodo utilizzato, insomma, si dovrà sempre passare dalla consueta forma site:cartella a nomeservice:cartella. Si noti che la cartella è quella interna alla root a cui accede il service, che non andrà quindi ovviamente specificata.

Aggiornamento dei record esistenti

La procedura sin qui descritta permetterà il corretto upload dei file sul bucket S3 dal momento della configurazione in poi, ma per i file già caricati sarà necessario, oltre allo spostamento fisico dei file dalla cartella site dell’applicativo alla cartella sul bucket, anche l’aggiornamento dei vecchi record, ad esempio tramite una touch:

@metadata(doUpdate=True)
def touch_updateImageUrl(self,record,old_record=None):
    "Update image url after S3 configuration"
    if '/_storage/site/social' in record['image']:
        record['image'] = record['image'].replace('/_storage/site/social', '/_storage/social')

S3 e Attachments Tables

Qualora invece il bucket S3 dovesse raccogliere gli allegati di una Attachments Table, sarà possibile aggiornare il path dove verrà effettuato l’upload dei file tramite il seguente metodo di hook:

def atc_getAttachmentPath(self,pkey):
    return 'candidati:attachments'

Anche in questo caso sarà infine necessario aggiornare i record tramite una touch, che in questo caso lanceremo direttamente dalla risorsa della tabella di attachments:

@metadata(doUpdate=True)
def touch_aggiornaAttachmentsUrl(self,record,old_record=None):
    "Aggiorna attachments url per configurazione S3"
    record['filepath'] = record['filepath'].replace('home:cvgest_candidato', 'candidati:attachments')

Vuoi saperne di più? Scrivi un commento nel box qui sotto oppure scrivici su AskGenropy!