2010-12-12 3 views
1

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

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

UPDATE: Я просто нашел эту ссылку, которая может объяснить немного, но, безусловно, должен быть какой-то способ сделать это ...

Read header data from files on remote server

ответ

4

могли бы хотеть, чтобы проверить AWS::S3, рубин Библиотека для Simple Service хранения Амазонки

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

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

+0

, который будет работать, за исключением того, что мои метаданные выглядят пустыми. вам нужно предоставить свои собственные метаданные с помощью s3? это было бы прекрасно, поскольку мне не пришлось бы загружать его. благодаря – holden

0

Это похоже на работу вместо открытого URI:

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

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

2

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 будет очищаться после этого, что должно поставить вас в состояние, в котором вы хотите находиться.

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|}