diff options
Diffstat (limited to 'actionpack/lib/action_dispatch/http/upload.rb')
-rw-r--r-- | actionpack/lib/action_dispatch/http/upload.rb | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/actionpack/lib/action_dispatch/http/upload.rb b/actionpack/lib/action_dispatch/http/upload.rb index c4a915d1ad..79437d6e85 100644 --- a/actionpack/lib/action_dispatch/http/upload.rb +++ b/actionpack/lib/action_dispatch/http/upload.rb @@ -1,9 +1,28 @@ module ActionDispatch module Http + # Models uploaded files. + # + # The actual file is accessible via the +tempfile+ accessor, though some + # of its interface is available directly for convenience. + # + # Uploaded files are temporary files whose lifespan is one request. When + # the object is finalized Ruby unlinks the file, so there is not need to + # clean them with a separate maintenance task. class UploadedFile - attr_accessor :original_filename, :content_type, :tempfile, :headers + # The basename of the file in the client. + attr_accessor :original_filename - def initialize(hash) + # A string with the MIME type of the file. + attr_accessor :content_type + + # A +Tempfile+ object with the actual uploaded file. Note that some of + # its interface is available directly. + attr_accessor :tempfile + + # TODO. + attr_accessor :headers + + def initialize(hash) # :nodoc: @tempfile = hash[:tempfile] raise(ArgumentError, ':tempfile is required') unless @tempfile @@ -12,13 +31,39 @@ module ActionDispatch @headers = hash[:head] end - def read(*args) - @tempfile.read(*args) + # Shortcut for +tempfile.read+. + def read(length=nil, buffer=nil) + @tempfile.read(length, buffer) + end + + # Shortcut for +tempfile.open+. + def open + @tempfile.open + end + + # Shortcut for +tempfile.close+. + def close(unlink_now=false) + @tempfile.close(unlink_now) + end + + # Shortcut for +tempfile.path+. + def path + @tempfile.path + end + + # Shortcut for +tempfile.rewind+. + def rewind + @tempfile.rewind + end + + # Shortcut for +tempfile.size+. + def size + @tempfile.size end - # Delegate these methods to the tempfile. - [:open, :path, :rewind, :size].each do |method| - class_eval "def #{method}; @tempfile.#{method}; end" + # Shortcut for +tempfile.eof?+. + def eof? + @tempfile.eof? end private @@ -29,7 +74,7 @@ module ActionDispatch end end - module Upload + module Upload # :nodoc: # Convert nested Hash to HashWithIndifferentAccess and replace # file upload hash with UploadedFile objects def normalize_parameters(value) |