2013-07-29 4 views
0

У меня есть приложение рельсы, и я хотел бы, чтобы загрузить часть файла с Amazon S3 с помощью следующего кода:Rails, частично загрузить файл из амазонок 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 

URL-адрес является правильным, я могу скачать файл через браузер. Но я получаю 403 ошибки от амазонки по команде http.request:

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

Как я могу скачать этот файл с рельсами? =)


К слову, наконец, у меня есть другое решение. Мне понадобился этот код, чтобы проверить длину трека после его загрузки на веб-сайт. Итак, это было так:
загрузить трек на S3 -> скачать часть его -> проверить длину
Но позже я заметил, что несущая волна автоматически загружает все в папку tmp, поэтому процесс загрузки на самом деле выглядит так:
загрузить в tmp -> загрузить с сайта на amazon s3 -> сохранить
И если мы позвоним: before_save callback, мы сможем открыть дорожку, прежде чем она будет загружена на 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 

В этом случае я упростил процесс много :)

Have сексуальный день!

+0

Попробуйте установить строку UserAgent на заголовки запроса http://railspro.blogspot.com.ar/2011/05/setting-user-agent-in-nethttp-request_7277.html – arieljuod

ответ

2

прямо сейчас вы только сделать запрос на пути, я думаю, вам нужно включить часть запроса, а также

full_path = (url.query.blank?) ? url.path : "#{url.path}?#{url.query}" 
req = Net::HTTP::Get.new(full_path) 

смотри также - http://house9.blogspot.com/2010/01/ruby-http-get-with-nethttp.html

+0

Работает отлично! –

Смежные вопросы