У меня есть приложение рельсы, и я хотел бы, чтобы загрузить часть файла с 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 сексуальный день!
Попробуйте установить строку UserAgent на заголовки запроса http://railspro.blogspot.com.ar/2011/05/setting-user-agent-in-nethttp-request_7277.html – arieljuod