我有一个 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
在那种情况下,我简化了很多过程:)
度过性感的一天!