1

我在从 S3 读取文件时遇到一些问题。我希望能够远程加载 ID3 标签,但是使用 open-URI 不起作用,它给了我以下错误:

ruby-1.8.7-p302 > c=TagLib2::File.new(open(URI.parse("http://recordtemple.com.s3.amazonaws.com/music/745/original/The%20Stranger.mp3?1292096514")))
TypeError: can't convert Tempfile into String
    from (irb):8:in `initialize'
    from (irb):8:in `new'
    from (irb):8

但是,如果我下载相同的文件并将其放在我的桌面上(即不需要 open-URI),它就可以正常工作。

c=TagLib2::File.new("/Users/momofwombie/Desktop/blah.mp3")

我还应该做些什么来读取远程文件吗?

更新:我刚刚找到这个链接,这可能会解释一点,但肯定有一些方法可以做到这一点......

从远程服务器上的文件中读取标头数据

4

4 回答 4

4

可能想查看AWS::S3,亚马逊简单存储服务的 Ruby 库

对文件执行一次AWS::S3:S3Object.find操作,然后使用about检索元数据

此解决方案假定您拥有访问包含相关文件的 S3 存储桶的 AWS 凭证和权限。

于 2010-12-12T18:35:42.123 回答
2

这个解决方案不会工作太久。Paperclip > 3.0.0 已删除 to_file。我正在使用 S3 和 Heroku。我最终做的是将文件复制到一个临时位置并从那里解析它。这是我的代码:

dest = Tempfile.new(upload.spreadsheet_file_name)
dest.binmode
upload.spreadsheet.copy_to_local_file(:default_style, dest.path)
file_loc = dest.path 

...

CSV.foreach(file_loc, :headers => true, :skip_blanks => true) do |row|}
于 2012-06-14T17:11:01.363 回答
2

TagLib2::File.new不带文件句柄,这是您在open不使用read.

添加后read,您将获得 URL 的内容,但TagLib2::File也不知道如何处理,因此您不得不阅读 URL 的内容并保存它。

我还注意到您不必要地使 OpenURI 的使用复杂化。在将 URLURI传递给open. 只需传递 URL 字符串。

require 'open-uri'

fname = File.basename($0) << '.' << $$.to_s
File.open(fname, 'wb') do |fo|
  fo.print open("http://recordtemple.com.s3.amazonaws.com/music/745/original/The%20Stranger.mp3?1292096514").read
end

c = TagLib2::File.new(fname)

# do more processing...

File.delete(fname)

我没有安装 TagLib2,但我运行了其余代码,并将 mp3 文件下载到我的磁盘并且可以播放。File.delete之后会清理,这应该让你处于你想要的状态。

于 2010-12-13T01:43:13.947 回答
0

这似乎代替了开放URI:

Mp3Info.open(mp3.to_file.path) do |mp3info|
  puts mp3info.tag.artist
end

Paperclip 有一个 to_file 方法,可以从 S3 下载文件。

于 2010-12-12T20:19:26.663 回答