ruby чтение файлов с S3 с открытым URI

У меня проблемы с чтением файла с S3. Я хочу иметь возможность удаленно загружать теги ID3, но использование открытого 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")

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

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

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


person holden    schedule 12.12.2010    source источник


Ответы (4)


Рекомендуем ознакомиться с AWS::S3, библиотекой Ruby для Amazon Simple Storage Service.

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

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

person Steve Wilhelm    schedule 12.12.2010
comment
это будет работать, за исключением того, что мои метаданные кажутся пустыми. вам нужно предоставить свои собственные метаданные с s3? это было бы идеально, так как мне не пришлось бы загружать его. спасибо - person holden; 12.12.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 очистится, что должно привести вас в состояние, в котором вы хотите быть.

person the Tin Man    schedule 13.12.2010

Это решение не будет работать намного дольше. Скрепка > 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|}
person kalwalkden    schedule 14.06.2012

Кажется, это работает вместо открытого URI:

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

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

person holden    schedule 12.12.2010