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

Amazon の Simple Storage Service の Ruby ライブラリであるAWS::S3をチェックしてみてください。

ファイルに対して を実行してから、メタデータを取得するために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はファイル ハンドルを取りません。これはopenread.

アドオンを追加するreadと、URL の内容を取得できますが、それをTagLib2::Fileどう処理するかもわからないため、URL の内容を読み取って保存する必要があります。

また、あなたが OpenURI の使用を不必要に複雑にしていることにも気付きました。URIに渡す前に、 を使用して URL を解析する必要はありません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

これは open-URI の代わりに機能するようです:

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

Paperclip には、S3 からファイルをダウンロードする to_file メソッドがあります。

于 2010-12-12T20:19:26.663 に答える