module IOStream

Provides method that can be included on File-type objects (IO, StringIO, Tempfile, etc) to allow stream copying and Tempfile conversion.

Public Instance Methods

stream_to(object, path_or_file, in_blocks_of = 8192) click to toggle source

Copies one read-able object from one place to another in blocks, obviating the need to load the whole thing into memory. Defaults to 8k blocks. Returns a File if a String is passed in as the destination and returns the IO or Tempfile as passed in if one is sent as the destination.

# File lib/dm-paperclip/iostream.rb, line 16
def stream_to object, path_or_file, in_blocks_of = 8192
  dstio = case path_or_file
          when String   then File.new(path_or_file, "wb+")
          when IO       then path_or_file
          when Tempfile then path_or_file
          end
  buffer = ""
  object.rewind
  while object.read(in_blocks_of, buffer) do
    dstio.write(buffer)
  end
  dstio.rewind
  dstio
end
to_tempfile(object) click to toggle source

Returns a Tempfile containing the contents of the readable object.

# File lib/dm-paperclip/iostream.rb, line 5
def to_tempfile(object)
  return object.to_tempfile if object.respond_to?(:to_tempfile)
  name = object.respond_to?(:original_filename) ? object.original_filename : (object.respond_to?(:path) ? object.path : "stream")
  tempfile = Paperclip::Tempfile.new(["stream", File.extname(name)])
  tempfile.binmode
  stream_to(object, tempfile)
end