2010-12-06 5 views
0

J'ai téléchargé un fichier sur s3 en utilisant un trombone .. le processus de téléchargement de fichiers fonctionne bien .. Maintenant, je voulais le télécharger. Dans mon modèle, j'ai mis mon :s3_host_alias .. maintenant que le fichier est privé .. donc si j'essaye d'aller chercher le fichier en utilisant la méthode url paperclip ... il me donne accès refusé l'erreur ...amazon s3 hébergement virtuel de seau

et si je utilise la méthode S3Object.url_for puis le retour d'url est s3.amazonaws.com/mybucket/path_of_file.

Je ne veux pas tht s3.amazonaws.com à afficher dans l'URL ainsi utilisé :s3_host_alias dans mon modèle et créé un serveur DNS CNAME inmy ... maintenant si j'utilise directement @object.url alors son donnant la bonne url mais jette l'accès refusé erreur. parce que je suppose que le ACCESS_KEY et la signature n'est pas passé ..

est-il un moyen de récupérer le fichier privé de s3 à l'aide en utilisant paperclip URL canonique ..

Répondre

0

Je ne me paperclip, mais oui, vous pouvez signer une requête S3 en utilisant un nom d'hôte virtuel.

0

J'ai rencontré ce problème lors de l'utilisation de Paperclip et de la gemme AWS :: S3. Paperclip a tout bien configuré pour les requêtes non authentifiées. Mais revenir à AWS :: S3 pour générer une URL authentifiée n'a pas utilisé l'alias de l'hôte S3.

Vous pouvez passer AWS :: S3 comme option de serveur sur la connexion, mais je n'avais pas besoin ou je voulais une connexion uniquement pour obtenir l'URL. Je ne pouvais pas non plus trouver un moyen de le configurer via la configuration (donc cela s'appliquerait en dehors d'une connexion). Même en jetant un coup d'œil à la source, on dirait que c'est non configurable. J'ai donc créé un patch de singe. Mon Ruby-fu (et peut-être mon OO-fu) ne sont pas très élevés, donc il y a peut-être une meilleure façon de le faire, mais ça marche pour ce dont j'ai besoin. Fondamentalement, je passe url_for pour un paramètre :s3_host_alias sur l'option hash, puis le patch singe l'utilise s'il est passé. S'il est passé, il doit également supprimer le compartiment du chemin généré.

Alors ....

Vous pouvez créer ce fichier 1 ligne, RAILS_ROOT/initializers/load_patches.rb, pour charger tous les correctifs en RAILS_ROOT/lib:

Dir[File.join(Rails.root, 'lib', 'patches', '**', '*.rb')].sort.each { |patch| require(patch) } 

Ensuite, créez le fichier RAILS_ROOT/lib/patches/aws.rb avec ce code:

http://pastie.org/1622881

Et vous pouvez appeler pour une URL authentifiée avec quelque chose le long de ces l ines (La configuration est une classe personnalisée pour le stockage, le natch, les valeurs de configuration):

AWS::S3::S3Object.url_for(media.path(style || media.default_style), media.bucket_name, :expires_in => expires_in, :use_ssl => false, :s3_host_alias => Configuration.s3_host_alias)