    # File lib/ramaze/helper/upload.rb, line 431
            def save(path = nil, options = {})
              # Merge options
              opts = trait[:options].merge(options)

              unless path
                # No path was provided, use info stored elsewhere to try to build
                # the path
                unless opts[:default_upload_dir]
                  raise StandardError.new('Unable to save file, no dirname given')
                end

                unless @filename
                  raise StandardError.new('Unable to save file, no filename given')
                end

                # Check to see if a proc or a string was used for the
                # default_upload_dir parameter. If it was a proc, call the proc and
                # use the result as the directory part of the path. If a string was
                # used, use the string directly as the directory part of the path.
                dn = opts[:default_upload_dir]

                if dn.respond_to?(:call)
                  dn = dn.call
                end

                path = File.join(dn, @filename)
              end

              path = File.expand_path(path)

              # Abort if file altready exists and overwrites are not allowed
              if File.exists?(path) and !opts[:allow_overwrite]
                raise StandardError.new('Unable to overwrite existing file')
              end

              # Confirm that we can read source file
              unless File.readable?(@tempfile.path)
                raise StandardError.new('Unable to read temporary file')
              end

              # Confirm that we can write to the destination file
              unless (File.exists?(path) and File.writable?(path)) \
              or (File.exists?(File.dirname(path)) \
                and File.writable?(File.dirname(path)))
                raise StandardError.new(
                  "Unable to save file to #{path}. Path is not writable"
                )
              end

              # If supported, use IO,copy_stream. If not, require fileutils
              # and use the same method from there
              if IO.respond_to?(:copy_stream)
                IO.copy_stream(@tempfile, path)
              else
                require 'fileutils'
                File.open(@tempfile.path, 'rb') do |src|
                  File.open(path, 'wb') do |dest|
                    FileUtils.copy_stream(src, dest)
                  end
                end
              end

              # Update the realfile property, indicating that the file has been
              # saved
              @realfile = File.new(path)

              # If the unlink_tempfile option is set to true, delete the temporary
              # file created by Rack
              unlink_tempfile if opts[:unlink_tempfile]
            end