Module: IOStream

Included in:
Paperclip::Attachment
Defined in:
lib/paperclip/iostream.rb

Overview

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

Instance Method Summary collapse

Instance Method Details

#stream_to(object, path_or_file, in_blocks_of = 8192) ⇒ Object

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.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/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) ⇒ Object

Returns a Tempfile containing the contents of the readable object.



5
6
7
8
9
10
11
# File 'lib/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