This is driving me crazy. Consider the following:
require 'open-uri'
#set up tempfile
extname = File.extname file_url
basename = File.basename(file_url, extname)
file = Tempfile.new([basename,extname])
#read form URI into tempfile
uri = URI.parse(file_url)
num_bytes_writen = file.write(uri.read)
puts "Wrote #{num_bytes_writen} bytes"
# Reading from my tempfile
puts "Opening: #{file.path} >>"
puts "#### BEGINING OF FILE ####"
puts File.open(file.path,'rb').read
puts "#### END OF FILE ####"
It looks like bytes get written, but when I try to open the file — its empty. Whats up ?!
And to make it more weird — everyting works in the Rails Console, but not when executed by a worker triggered by Resque.
Any ideas? Thanks guys
This is a problem of buffering. You need to flush the IO buffer to disk before trying to read it. Either
file.close(if you’ve finished with it) orfile.flushbefore doing theFile.openfor the read.Update
I hadn’t thought about this, but you don’t need to reopen the temp file just to read it. It’s already open for writing and reading, all you need to do is seek to the start of the file before reading. This way you don’t have to do the flush (because you’re actually reading from the buffer)…
Another Update
After a comment from @carp I have adjusted the code above to use
rewindinstead ofseek 0because it also resetslinenoto0(and not having that done, if you were usinglinenowould be very confusing). Also actually it’s a more expressive method name.