чтение файлов ruby ​​из S3 с открытым URI - PullRequest
1 голос
/ 12 декабря 2010

У меня проблемы с чтением файла с 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

Однако, если я скачаю тот же файл и положу его на свой рабочий стол (т.е. нет необходимости в открытом URI), он будет работать просто отлично.

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

Есть ли что-то еще, что я должен сделать, чтобы прочитать удаленный файл?

ОБНОВЛЕНИЕ: Я только что нашел эту ссылку, которая может немного объяснить, но наверняка должен быть какой-то способ сделать это ...

Чтение данных заголовка из файлов на удаленном сервере

Ответы [ 4 ]

4 голосов
/ 12 декабря 2010

Возможно, стоит проверить AWS :: S3 , библиотеку Ruby для Amazon Simple Storage Service

Выполните AWS::S3:S3Object.find для файла и затем используйте about для извлеченияметаданные

В этом решении предполагается, что у вас есть учетные данные AWS и разрешение на доступ к корзине S3, содержащей файлы, о которых идет речь.

2 голосов
/ 14 июня 2012

Это решение не будет работать намного дольше. Скрепка> 3.0.0 удалена в_файл. Я использую 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|}
2 голосов
/ 13 декабря 2010

TagLib2::File.new не берет дескриптор файла, который вы передаете ему, когда используете open без read.

Добавьте read, и вы получите содержимое URL, но TagLib2::File тоже не знает, что с этим делать, поэтому вы вынуждены прочитать содержимое URL и сохранить его.

Я также заметил, что вы излишне усложняете использование OpenURI. Вам не нужно анализировать URL-адрес с помощью URI, прежде чем передавать его на 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 впоследствии очистит, что приведет вас в состояние, в котором вы хотите быть.

0 голосов
/ 12 декабря 2010

Это похоже на работу вместо open-URI:

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

У Paperclip есть метод to_file, который загружает файл из S3.

...