Make send_file guess content-type from file extension, if type wasn't supplied (Issue #1847). Update tests & documentation.
This commit is contained in:
parent
d73269ba53
commit
2a61d47b55
@ -26,8 +26,11 @@ module DataStreaming
|
||||
# Options:
|
||||
# * <tt>:filename</tt> - suggests a filename for the browser to use.
|
||||
# Defaults to <tt>File.basename(path)</tt>.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'. You can specify
|
||||
# either a string or a symbol for a registered type register with <tt>Mime::Type.register</tt>, for example :json
|
||||
# * <tt>:type</tt> - specifies an HTTP content type.
|
||||
# You can specify either a string or a symbol for a registered type register with
|
||||
# <tt>Mime::Type.register</tt>, for example :json
|
||||
# If omitted, type will be guessed from the file extension specified in <tt>:filename</tt>.
|
||||
# If no content type is registered for the extension, default type 'application/octet-stream' will be used.
|
||||
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
|
||||
# Valid values are 'inline' and 'attachment' (default).
|
||||
# * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
|
||||
@ -84,6 +87,8 @@ def send_file(path, options = {}) #:doc:
|
||||
# * <tt>:filename</tt> - suggests a filename for the browser to use.
|
||||
# * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'. You can specify
|
||||
# either a string or a symbol for a registered type register with <tt>Mime::Type.register</tt>, for example :json
|
||||
# If omitted, type will be guessed from the file extension specified in <tt>:filename</tt>.
|
||||
# If no content type is registered for the extension, default type 'application/octet-stream' will be used.
|
||||
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
|
||||
# Valid values are 'inline' and 'attachment' (default).
|
||||
# * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
|
||||
@ -108,6 +113,8 @@ def send_data(data, options = {}) #:doc:
|
||||
|
||||
private
|
||||
def send_file_headers!(options)
|
||||
type_provided = options.has_key?(:type)
|
||||
|
||||
options.update(DEFAULT_SEND_FILE_OPTIONS.merge(options))
|
||||
[:type, :disposition].each do |arg|
|
||||
raise ArgumentError, ":#{arg} option required" if options[arg].nil?
|
||||
@ -123,6 +130,10 @@ def send_file_headers!(options)
|
||||
raise ArgumentError, "Unknown MIME type #{options[:type]}" unless extension
|
||||
self.content_type = extension
|
||||
else
|
||||
if !type_provided && options[:filename]
|
||||
# If type wasn't provided, try guessing from file extension.
|
||||
content_type = Mime::Type.lookup_by_extension(File.extname(options[:filename]).downcase.tr('.','')) || content_type
|
||||
end
|
||||
self.content_type = content_type
|
||||
end
|
||||
|
||||
|
@ -138,6 +138,25 @@ def test_send_file_headers_with_bad_symbol
|
||||
@controller.headers = {}
|
||||
assert_raise(ArgumentError){ @controller.send(:send_file_headers!, options) }
|
||||
end
|
||||
|
||||
def test_send_file_headers_guess_type_from_extension
|
||||
{
|
||||
'image.png' => 'image/png',
|
||||
'image.jpeg' => 'image/jpeg',
|
||||
'image.jpg' => 'image/jpeg',
|
||||
'image.tif' => 'image/tiff',
|
||||
'image.gif' => 'image/gif',
|
||||
'movie.mpg' => 'video/mpeg',
|
||||
'file.zip' => 'application/zip',
|
||||
'file.unk' => 'application/octet-stream',
|
||||
'zip' => 'application/octet-stream'
|
||||
}.each do |filename,expected_type|
|
||||
options = { :filename => filename }
|
||||
@controller.headers = {}
|
||||
@controller.send(:send_file_headers!, options)
|
||||
assert_equal expected_type, @controller.content_type
|
||||
end
|
||||
end
|
||||
|
||||
%w(file data).each do |method|
|
||||
define_method "test_send_#{method}_status" do
|
||||
|
Loading…
Reference in New Issue
Block a user