class Rack::Test::UploadedFile
Wraps a Tempfile with a content type. Including one or more UploadedFile's in the params causes Rack::Test
to build and issue a multipart request.
Example:
post "/photos", "file" => Rack::Test::UploadedFile.new("me.jpg", "image/jpeg")
Attributes
The content type of the “uploaded” file
The filename, not including the path, of the “uploaded” file
The tempfile
Public Class Methods
Creates a new UploadedFile
instance.
Arguments:
- content
-
is a path to a file, or an {IO} or {StringIO} object representing the content.
content_type
-
MIME type of the file
- binary
-
Whether the file should be set to binmode (content treated as binary).
original_filename
-
The filename to use for the file. Required if content is StringIO, optional override if not
# File lib/rack/test/uploaded_file.rb, line 31 def initialize(content, content_type = 'text/plain', binary = false, original_filename: nil) @content_type = content_type @original_filename = original_filename case content when StringIO initialize_from_stringio(content) else initialize_from_file_path(content) end @tempfile.binmode if binary end
Public Instance Methods
Append to given buffer in 64K chunks to avoid multiple large copies of file data in memory. Rewind tempfile before and after to make sure all data in tempfile is appended to the buffer.
# File lib/rack/test/uploaded_file.rb, line 60 def append_to(buffer) tempfile.rewind buf = String.new buffer << tempfile.readpartial(65_536, buf) until tempfile.eof? tempfile.rewind nil end
Delegate all methods not handled to the tempfile.
# File lib/rack/test/uploaded_file.rb, line 52 def method_missing(method_name, *args, &block) tempfile.public_send(method_name, *args, &block) end
The path to the tempfile. Will not work if the receiver's content is from a StringIO.
# File lib/rack/test/uploaded_file.rb, line 46 def path tempfile.path end
Private Instance Methods
Create a tempfile and copy the content from the given path into the tempfile, optionally renaming if original_filename
has been set.
# File lib/rack/test/uploaded_file.rb, line 86 def initialize_from_file_path(path) raise "#{path} file does not exist" unless ::File.exist?(path) @original_filename ||= ::File.basename(path) extension = ::File.extname(@original_filename) @tempfile = Tempfile.new([::File.basename(@original_filename, extension), extension]) @tempfile.set_encoding(Encoding::BINARY) FileUtils.copy_file(path, @tempfile.path) end
Use the StringIO as the tempfile.
# File lib/rack/test/uploaded_file.rb, line 78 def initialize_from_stringio(stringio) raise(ArgumentError, 'Missing `original_filename` for StringIO object') unless @original_filename @tempfile = stringio end