Question

Je pense savoir si d'accueillir téléchargé des fichiers multimédias (vidéo et audio) sur S3 au lieu de localement. Je dois vérifier les permissions de l'utilisateur sur chaque téléchargement.

Il y aurait donc une action comme get_file, qui vérifie d'abord les permissions de l'utilisateur et obtient le fichier de S3 et l'envoie à l'aide send_file à l'utilisateur.

def get_file
  if @user.can_download(params[:file_id])
    # first, download the file from S3 and then send it to the user using send_file
  end
end

Mais dans ce cas, le serveur (inutilement) télécharge le fichier d'abord de S3 puis l'envoie à l'utilisateur. Je pensais que le cas d'utilisation pour S3 devait passer outre la pile de serveur Rails / HTTP pour une charge réduite.

Suis-je penser ce mal?

PS. J'utilise CarrierWave pour le téléchargement de fichiers. Je ne sais pas si cela est pertinent.

Était-ce utile?

La solution

Amazon S3 fournit quelque chose appelé RESTful lit authentifié, qui sont essentiellement des URL timeoutable au contenu protégé par ailleurs.

CarrierWave apporte son soutien à cette fin. Il suffit de déclarer la politique d'accès S3 à lire authentifié:

  config.s3_access_policy = :authenticated_read

et model.file.url génère automatiquement l'URL RESTful.

Autres conseils

En général, vous avait l'URL S3 intégrer dans votre page, de sorte que le navigateur du client va chercher le fichier directement sur Amazon. Notez cependant que cela expose l'URL non protégé brut. Vous pouvez nommer le fichier avec un hash long au lieu de quelque chose prévisible, il est du moins pas devinables - mais une fois que l'URL est exposée, il est essentiellement ouvert à Internet. Donc, si vous avez besoin absolument toujours le contrôle d'accès sur les fichiers, vous aurez besoin de proxy comme vous faites actuellement. Dans ce cas, vous pouvez décider qu'il est juste préférable de stocker le fichier localement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top