2013-07-29 74 views
0

我有一個Rails應用程序,我很想下載從Amazon S3文件的一部分與下面的代碼:Rails的,部分下載來自Amazon S3的文件

url = URI.parse('https://topdisplay.s3-eu-west-1.amazonaws.com/uploads/song/url/15/[email protected]&Signature=fsdfdfdgfvvsersf') # turn the string into a URI 
http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = true #S3 uses SSL, isn't it? 
req = Net::HTTP::Get.new(url.path) # init a request with the url 
req.range = (0..4096) # limit the load to only 4096 bytes 
res = http.request(req) # load the mp3 file 
Mp3Info.open(StringIO.open(res.body)) do |m| #do the parsing 
    puts m 
end 

的網址是否正確,我可以下載一個文件通過瀏覽器。但我從http.request命令從亞馬遜403錯誤:

res = http.request(req) 
=> #<Net::HTTPForbidden 403 Forbidden readbody=true> 

我如何可以下載與軌道文件? =)


順便說一下,最後,我有另一種解決方案。上傳到網站後,我需要該代碼來檢查曲目長度。所以它看起來像這樣:
上傳軌道到S3 - >下載部分 - >檢查長度
但後來我注意到,carrierwave自動將所有內容自動上傳到tmp文件夾中,因此上傳過程實際上看起來像這樣:
上傳到tmp目錄 - >從網站上傳到Amazon S3 - >保存
如果我們致電:before_save回調,我們將能夠打開跟蹤它上傳到S3之前。 因此,代碼應該看起來像:

before_save :set_duration 

Mp3Info.open('public'+url.to_s) do |m| #do the parsing 
     self.duration = m.length.to_i 
     self.name = m.tag.title if self.name == "" 
end 

在這種情況下,我簡化了操作步驟很多:)

擁有性感的一天!

+0

嘗試的請求頭設置一個用戶代理字符串http://railspro.blogspot.com.ar/2011/05/setting-user-agent-in-nethttp-request_7277.html – arieljuod

回答