module IOStream

def stream_to path_or_file, in_blocks_of = 8192

and returns the IO or Tempfile as passed in if one is sent as the destination.
worries or memory overhead worries. Returns a File if a String is passed in as the destination
StringIO and Tempfile, then either can have its data copied anywhere else without typing
the whole thing into memory. Defaults to 8k blocks. If this module is included in both
Copies one read-able object from one place to another in blocks, obviating the need to load
def stream_to 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 = ""
  self.rewind
  while self.read(in_blocks_of, buffer) do
    dstio.write(buffer)
  end
  dstio.rewind    
  dstio
end

def to_tempfile

Returns a Tempfile containing the contents of the readable object.
def to_tempfile
  tempfile = Tempfile.new("stream")
  tempfile.binmode
  self.stream_to(tempfile)
end