2014-04-23 5 views
0

AWS 버킷에서 파일을 다운로드하고 임시 폴더에 저장하려고합니다.Rails AWS S3 : 파일 다운로드 및 임시 폴더에 저장

아래의 코드는이 오류를 반환 OpenURI :: HTTPError (301 영구적으로 이동 (잘못된 위치 URI)) :

@filename 문자열로, 확장명을 포함한 버킷 내에서 파일 이름입니다. 여기

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 

는 지금까지 발견 한 내용은 다음과 같습니다

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

첫 번째 버킷 호출이 올바른 개체, 두 번째 반환 반환이 :

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

당신이로 이동 반환 된 URL입니다.

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

이 (http://www.sitefinity.com/developer-network/forums/set-up-installation/amazon-s3---must-be-addressed-using-the-specified-endpoint)에는 "S3에 제한 사항이 있습니다. 따라서"US 표준 "이 아닌 버킷을 만들면 버킷 주소에 경로 스타일 구문을 사용할 수 없습니다."

그러나이 버킷을 확인한 결과 def입니다. 지역 미국 표준.

편집 :

나는 바보입니다. AWS 기본값이 미국 표준임을 읽었습니다. 하지만 서쪽은 표준이 아니에요, 동쪽 그래서 나는 그것이 미국 표준을 기본으로하지 않는다고 생각합니다.

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

와 그 어리 석음을 수정 한 후 지금은이 오류가 발생 해요 :

OpenURI::HTTPError (404 Not Found) 

그러나, 아래의 코드에서 생성 된 URL은 사운드 파일로 이어질 않습니다.

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

그래서 문제는

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

생각으로 거짓말을해야 하는가?

답변

4

여기에는 두 가지가 있습니다. 첫째, 미국 표준 지역은 실제로 버지니아 또는 오레곤입니다. 아마존이 버킷을 위해 오레곤을 선택했기 때문에 리디렉션되고 있다는 것을 깨달을 필요가 있습니다. 지역을 설명하는 URL은 현재 여기에 있습니다 :

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

두 번째 일이 진행하는 리디렉션입니다. 연결할 때 오레곤으로 리다이렉트되고 있습니다. 전형적인 S3 엔드 포인트는 대기 시간 DNS에 가장 근접하기 때문에 연결됩니다. 나중에 버지니아에서 하드 코드하면 버킷이 오레곤에있는 것처럼 보이지 않습니다.

아마존은 어떻게 S3가 당신을 리다이렉트시키는 지, 그리고 어떻게 처리하는지에 관한 문서를 가지고 있습니다.

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

당신이 툴킷을 사용하고 오히려 API보다, 내가 특별히 리디렉션을 따르지 않을 이유를 말할 것 루비 단조 또는 아마존 문서에 아무것도 표시되지 않았기 때문에. 작년 AWS 루비 SDK를 사용하는 다른 사람들도이 문제를 겪었습니다. 최신 버전에서는 수정 될 수 있습니다.

내가 말하는거다 문서는 여기에 있습니다 :

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

아마존은 여기에 새로운 문서를 가지고 나타납니다

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

또 다른 것은 내가 리디렉션 것을 불평을보고 있다는 것입니다 URL 형식이 잘못되었습니다. 해당 동작을 복제 할 수는 없지만 오레곤 엔드 포인트에 요청하여이 문제가 해결되는지 확인하려고합니다.

관련 문제