Ruby อ่านไฟล์จาก S3 ด้วย open-URI

ฉันมีปัญหาในการอ่านไฟล์จาก 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")

มีสิ่งอื่นใดที่ฉันควรทำเพื่ออ่านไฟล์ระยะไกลหรือไม่

UPDATE: ฉันเพิ่งพบลิงค์นี้ ซึ่งอาจอธิบายได้นิดหน่อย แต่แน่นอนว่าต้องมีวิธีการทำเช่นนี้ ...

อ่านข้อมูลส่วนหัวจากไฟล์บนเซิร์ฟเวอร์ระยะไกล


person holden    schedule 12.12.2010    source แหล่งที่มา


คำตอบ (4)


อาจต้องลองดู AWS::S3 ซึ่งเป็น Ruby Library สำหรับ Simple Storage Service ของ Amazon

ทำ 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

ดูเหมือนว่าจะใช้งานได้แทน open-URI:

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

คลิปหนีบกระดาษมีวิธี to_file ที่จะดาวน์โหลดไฟล์จาก S3

person holden    schedule 12.12.2010