2010-12-12 5 views
1

Ich habe ein paar Probleme beim Lesen einer Datei von S3. Ich möchte der Ferne die ID3-Tags laden zu können, aber unter Verwendung von Open-URI nicht funktioniert, es gibt mir die folgende Fehlermeldung:Ruby Dateien aus S3 mit Open-URI lesen

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 

aber wenn ich laden Sie die gleiche Datei und legen Sie sie auf meinem Desktop (dh keine Notwendigkeit für Open-URI), es funktioniert gut.

Gibt es noch etwas, was ich tun sollte, um eine Remote-Datei zu lesen?

UPDATE: Ich habe gerade diesen Link, die ein wenig erklären kann, aber sicher muss es eine Möglichkeit, dies zu tun ...

Read header data from files on remote server

Antwort

4

wollen Könnte AWS::S3 überprüfen, ein Ruby Bibliothek für Simple Storage Service

Amazon Sie eine AWS::S3:S3Object.find für die Datei und dann eine Verwendung about die Metadaten

Diese Lösung abrufen vorausgesetzt, dass Sie haben th e AWS-Anmeldeinformationen und Berechtigungen zum Zugreifen auf den S3-Bucket, der die fraglichen Dateien enthält.

+0

das würde funktionieren, außer meine Metadaten scheint leer zu sein. Müssen Sie Ihre eigenen Metadaten mit s3 angeben? das wäre perfekt, da ich es nicht herunterladen müsste. Vielen Dank – holden

0

Dies scheint anstelle von Open-URI zu arbeiten:

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

Büroklammer hat eine to_file Methode, die die Datei von S3 herunterlädt.

2

TagLib2::File.new nimmt kein Datei-Handle, was Sie übergeben, wenn Sie open ohne read verwenden.

Hinzufügen auf read und Sie werden den Inhalt der URL erhalten, aber TagLib2::File weiß nicht, was damit zu tun, so dass Sie gezwungen sind, den Inhalt der URL zu lesen, und speichern Sie es.

Ich bemerkte auch, dass Sie Ihre Verwendung von OpenURI unnötig verkomplizieren. Sie müssen die URL nicht mit URI analysieren, bevor Sie sie an open übergeben. Übergeben Sie einfach die URL-Zeichenfolge.

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) 

Ich habe nicht TagLib2 installiert, aber ich lief den Rest des Codes und die MP3-Datei auf meiner Festplatte heruntergeladen und ist spielbar. Die File.delete würde danach aufräumen, was dich in den Zustand bringen sollte, in dem du sein willst.

2

Diese Lösung wird nicht mehr lange funktionieren. Büroklammer> 3.0.0 hat to_file entfernt. Ich benutze S3 & Heroku. Am Ende habe ich die Datei an einen temporären Speicherort kopiert und von dort aus analysiert. Hier ist mein Code:

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