0

我有一个 Rails 应用程序,我很想从 Amazon S3 下载部分文件,代码如下:

url = URI.parse('https://topdisplay.s3-eu-west-1.amazonaws.com/uploads/song/url/15/09_-_No_Goodbyes.mp3?AWSAccessKeyId=dfsfsdf@fdfsd&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>

我如何使用rails下载该文件?=)


顺便说一句,最后,我有另一个解决方案。在将其上传到网站后,我需要该代码来检查轨道长度。所以看起来是这样的:
上传曲目到S3->下载部分->检查长度
但后来我注意到carrierwave会先自动将所有内容上传到tmp文件夹,所以上传过程实际上是这样的:
上传到tmp->从网站上传到亚马逊 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

在那种情况下,我简化了很多过程:)

度过性感的一天!

4

1 回答 1

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

于 2013-07-29T21:46:44.037 回答