2014-04-23 5 views
0

Je tente de télécharger un fichier à partir de mon compartiment AWS et de le stocker dans mon dossier temporaire.Rails AWS S3: Téléchargement de fichier et stockage dans le dossier temporaire

Le code ci-dessous renvoie cette erreur: openURI :: HTTPError (301 Déplacé de manière permanente (non valide Emplacement URI)):

@filename est le nom du fichier dans le seau, y compris l'extension, comme une chaîne.

S3 = AWS::S3.new(
    :access_key_id => ENV["AWS_ACCESS_KEY_ID"], 
    :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"] 
) 

BUCKET = S3.buckets["name_of_bucket"] 

File.open(Rails.root.join("tmp",@filename), "wb") do |file| 
file.write open(BUCKET.objects[@filename].url_for(:read)).read 
end 

Voici ce que j'ai trouvé à ce jour:

puts BUCKET.objects['name_of_bucket'] 
puts BUCKET.objects['name_of_bucket'].url_for(:read) 

Le premier appel SEAU retourne l'objet correct, le second renvoie cette:

https://ekohotstorage.s3-us-west-2.amazonaws.com/location_info 

Quand vous allez à cette url c'est ce qui est retourné

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. 

Ceci (http://www.sitefinity.com/developer-network/forums/set-up-installation/amazon-s3---must-be-addressed-using-the-specified-endpoint) indique "il y a une limitation dans S3, où si vous créez un compartiment qui n'est pas" US Standard ", vous ne pouvez pas utiliser la syntaxe de style de chemin dans l'adresse de compartiment."

Cependant, j'ai vérifié ce seau et c'est déf. Région US Standard.

Éditer:

Je suis stupide; J'avais lu que la valeur par défaut d'AWS était US Standard. Mais l'ouest n'est pas standard, l'est est donc je suppose qu'il ne fait pas défaut à US Standard.

Après la fixation de cette folie avec

S3 = AWS::S3.new(
    :access_key_id => ENV["AWS_ACCESS_KEY_ID"], 
    :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"], 
    :region => "us-east-1" 
) 

Je reçois maintenant cette erreur:

OpenURI::HTTPError (404 Not Found) 

Cependant, l'url créé à partir du code ci-dessous ne conduit au fichier son.

BUCKET.objects['name_of_bucket'].url_for(:read) 

Donc, la question doit se trouver avec

File.open(Rails.root.join("tmp",@filename), "wb") do |file| 
file.write open(BUCKET.objects[@filename].url_for(:read)).read 
end 

pensées?

Répondre

4

Il semble y avoir deux choses qui se passent ici. Premièrement, la région standard des États-Unis est en fait soit la Virginie soit l'Oregon. Vous avez juste besoin de réaliser que vous êtes redirigé parce que Amazon a choisi l'Oregon pour votre seau. L'URL expliquant les régions est actuellement ici:

http://docs.aws.amazon.com/AmazonS3/latest/dev/LocationSelection.html

La deuxième chose est en cours de redirection. Vous êtes redirigé vers l'Oregon lorsque vous vous connectez, car le point de terminaison S3 typique que vous verrez est le DNS le plus proche par latence. Lorsque vous codez plus tard en Virginie, vous ne voyez pas votre seau comme c'est le cas en Oregon.

Amazon a quelques documents ici sur la façon dont S3 vous redirigera et comment gérer cela.

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTRedirect.html

Puisque vous utilisez une boîte à outils et plutôt que d'une API, je ne vois rien en particulier dans la forge de rubis ou de la documentation Amazon qui raconterait pourquoi la redirection n'est pas suivi. Il semble que d'autres personnes avec le SDK AWS ruby ​​aient eu ce problème l'année dernière. Il peut être réparé dans les versions les plus récentes.

La documentation que je fais allusion est ici:

http://amazon.rubyforge.org/doc/

Amazon semble avoir plus récente documentation ici:

http://docs.aws.amazon.com/AWSRubySDK/latest/

Une autre chose est que j'ai vu des plaintes que la redirection L'URL a été mal formée. Bien que je n'étais pas capable de reproduire ce comportement, j'essaierais d'envoyer la demande au point de terminaison Oregon pour voir si cela résout votre problème.

Questions connexes