2010-03-07 8 views
5

Diciamo, ho un'applicazione Web che consente agli utenti di caricare immagini e documenti e la mia applicazione memorizza tutte queste risorse su S3, c'è un modo per monitorare l'utilizzo delle risorse per account utente PER?È possibile monitorare l'utilizzo delle risorse di Amazon S3 tramite un'app Ruby on Rails?

Ad esempio, se un account utente ha un limite di archiviazione di 1 GB, come posso monitorare la quantità di quella indennità che ogni individuo sta utilizzando?

Inoltre (ma questo è meno di un problema per me) se tale account utente ha anche un limite di larghezza di banda di 5 GB, ci sono strumenti disponibili che mi permettono di monitorare solo la larghezza di banda S3?

risposta

2

Sì, questo è possibile. Puoi utilizzare papreclip per gestire i caricamenti di file (o qualsiasi altro plugin/gemma di gestione del caricamento affidabile). La maggior parte di questi strumenti ti dà accesso alla dimensione del file caricato. Puoi semplicemente archiviare questi file nel database insieme a asset_uri (che immagino tu stia già archiviando), e per verificare se un utente può caricare un altro file, sommi semplicemente tutte le dimensioni di tutte le risorse con id_utente appropriato.

Users: 
    id 
    email_address 
    first_name 
    upload_limit 

Assets: 
    id 
    user_id 
    uri 
    filesize 
    filename 

Poi, per afferrare la dimensione totale dei file caricati da un particolare utente, si potrebbe fare:

class User < ActiveRecord::Base 
    has_many :assets 

    #Check if the user can upload another file 
    def can_upload? 
    if Asset.sum('filesize', :conditions => 'user_id = #{self.id}') >= self.upload_limit 
     return false 
    else 
     return true 
    end 
    end 

    #See the user's used storage space 
    def used_storage 
    return Asset.sum('filesize', :conditions => 'user_id = #{self.id}') 
    end 

    #See how much space the user has remaining 
    def available_storage 
    if self.can_upload? 
     return self.upload_limit - Asset.sum('filesize', :conditions => 'user_id = #{self.id}') 
    else 
     return 0 
    end 
    end 
end 

Si può vedere che sto facendo uso della funzione ActiveRecord sum qui per fare il calcolo . Si potrebbe facilmente usare una mappa o qualche altra soluzione basata su rubino.