2010-03-07 13 views
5

Digamos que tengo una aplicación web que permite a los usuarios cargar imágenes y documentos y mi aplicación almacena todos esos activos en S3, ¿hay alguna forma de que pueda monitorear el uso de recursos por cuenta de usuario?¿Es posible controlar el uso de los recursos de Amazon S3 a través de la aplicación Ruby on Rails?

Por ejemplo, si una cuenta de usuario tiene un límite de almacenamiento de 1GB, ¿cómo puedo controlar cuánto de esa asignación está usando una persona?

Además (pero esto no es un problema para mí) si esa cuenta de usuario también tiene un límite de ancho de banda de 5GB, ¿hay herramientas disponibles que me permitan monitorear solo su ancho de banda S3?

Respuesta

2

Sí, esto es posible. Puede usar papreclip para administrar las cargas de archivos (o cualquier otro plugin/gema de carga de buena reputación). La mayoría de estas herramientas le dan acceso al tamaño de archivo del archivo cargado. Simplemente puede almacenar estos archivos en la base de datos junto con el asset_uri (que imagino que ya está almacenando), y para verificar si un usuario puede cargar otro archivo, simplemente sume todos los tamaños de todos los activos con el user_id apropiado.

Users: 
    id 
    email_address 
    first_name 
    upload_limit 

Assets: 
    id 
    user_id 
    uri 
    filesize 
    filename 

Entonces, para agarrar el tamaño total de los archivos cargados por un usuario en particular, se puede hacer:

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 

Se puede ver que estoy haciendo uso de la función ActiveRecord sum aquí para hacer el cálculo . También podría usar fácilmente un mapa o alguna otra solución basada en ruby.

Cuestiones relacionadas