class MIME::Types
MIME::Types¶ ↑
MIME types are used in MIME-compliant communications, as in e-mail or HTTP traffic, to indicate the type of content which is transmitted. MIME::Types provides the ability for detailed information about MIME entities (provided as a set of MIME::Type objects) to be determined and used programmatically. There are many types defined by RFCs and vendors, so the list is long but not complete; don't hesitate to ask to add additional information. This library follows the IANA collection of MIME types (see below for reference).
Description¶ ↑
MIME types are used in MIME entities, as in email or HTTP traffic. It is useful at times to have information available about MIME types (or, inversely, about files). A MIME::Type stores the known information about one MIME type.
Usage¶ ↑
require 'mime/types' plaintext = MIME::Types['text/plain'] print plaintext.media_type # => 'text' print plaintext.sub_type # => 'plain' puts plaintext.extensions.join(" ") # => 'asc txt c cc h hh cpp' puts plaintext.encoding # => 8bit puts plaintext.binary? # => false puts plaintext.ascii? # => true puts plaintext.obsolete? # => false puts plaintext.registered? # => true puts plaintext == 'text/plain' # => true puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip'
This module is built to conform to the MIME types of RFCs 2045 and 2231. It follows the official IANA registry at www.iana.org/assignments/media-types/ and ftp.iana.org/assignments/media-types with some unofficial types added from the the collection at www.ltsw.se/knbase/internet/mime.htp
Constants
- DATA_VERSION
- TEXT_FORMAT_RE
The regular expression used to match a file-based MIME type definition.
- VERSION
The released version of Ruby MIME::Types
Attributes
The data version.
Public Class Methods
# File lib/mime/types.rb, line 590 def initialize(data_version = DATA_VERSION) @type_variants = HashWithArrayDefault.new @extension_index = HashWithArrayDefault.new @data_version = data_version end
Public Instance Methods
Returns a list of MIME::Type objects, which may be empty. The optional flag parameters are :complete (finds only complete MIME::Type objects) and :platform (finds only MIME::Types for the current platform). It is possible for multiple matches to be returned for either type (in the example below, 'text/plain' returns two values – one for the general case, and one for VMS systems.
puts "\nMIME::Types['text/plain']" MIME::Types['text/plain'].each { |t| puts t.to_a.join(", ") } puts "\nMIME::Types[/^image/, :complete => true]" MIME::Types[/^image/, :complete => true].each do |t| puts t.to_a.join(", ") end
If multiple type definitions are returned, returns them sorted as follows:
1. Complete definitions sort before incomplete ones; 2. IANA-registered definitions sort before LTSW-recorded definitions. 3. Generic definitions sort before platform-specific ones; 4. Current definitions sort before obsolete ones; 5. Obsolete definitions with use-instead clauses sort before those without; 6. Obsolete definitions use-instead clauses are compared. 7. Sort on name.
# File lib/mime/types.rb, line 647 def [](type_id, flags = {}) matches = case type_id when MIME::Type @type_variants[type_id.simplified] when Regexp match(type_id) else @type_variants[MIME::Type.simplified(type_id)] end prune_matches(matches, flags).sort { |a, b| a.priority_compare(b) } end
Add one or more MIME::Type objects to the set of known types. Each type should be experimental (e.g., 'application/x-ruby'). If the type is already known, a warning will be displayed.
<strong>Please inform the maintainer of this module when registered types are missing.</strong>
# File lib/mime/types.rb, line 688 def add(*types) types.each do |mime_type| if mime_type.kind_of? MIME::Types add(*mime_type.defined_types) else if @type_variants.include?(mime_type.simplified) if @type_variants[mime_type.simplified].include?(mime_type) warn "Type #{mime_type} already registered as a variant of #{mime_type.simplified}." unless defined? MIME::Types::LOAD end end add_type_variant(mime_type) index_extensions(mime_type) end end end
Returns the number of known types. A shortcut of MIME::Types.size. (Keep in mind that this is memory intensive, cache the result to spare resources)
# File lib/mime/types.rb, line 611 def count defined_types.size end
# File lib/mime/types.rb, line 615 def each defined_types.each { |t| yield t } end
A synonym for #type_for
# File lib/mime/types.rb, line 678 def of(filename, platform = false) type_for(filename, platform) end
Return the list of MIME::Types which belongs to
the file based on its filename extension. If platform
is
true
, then only file types that are specific to the current
platform will be returned.
This will always return an array.
puts "MIME::Types.type_for('citydesk.xml') => [application/xml, text/xml] puts "MIME::Types.type_for('citydesk.gif') => [image/gif]
# File lib/mime/types.rb, line 670 def type_for(filename, platform = false) ext = filename.chomp.downcase.gsub(/.*\./o, '') list = @extension_index[ext] list.delete_if { |e| not e.platform? } if platform list end
Private Instance Methods
# File lib/mime/types.rb, line 949 def __types__ load_mime_types unless @__types__ @__types__ end
Returns the currently defined cache file, if any.
# File lib/mime/types.rb, line 892 def cache_file ENV['RUBY_MIME_TYPES_CACHE'] end
# File lib/mime/types.rb, line 945 def lazy_load? (lazy = ENV['RUBY_MIME_TYPES_LAZY_LOAD']) && (lazy != 'false') end
# File lib/mime/types.rb, line 937 def load_and_parse_mime_types const_set(:LOAD, true) unless $DEBUG Dir[File.join(File.dirname(__FILE__), 'types', '*')].sort.each { |f| add(load_from_file(f)) } remove_const :LOAD if defined? LOAD end
# File lib/mime/types.rb, line 954 def load_mime_types @__types__ = new(VERSION) unless load_mime_types_from_cache load_and_parse_mime_types write_mime_types_to_cache end end
# File lib/mime/types.rb, line 897 def load_mime_types_from_cache load_mime_types_from_cache! if cache_file end
# File lib/mime/types.rb, line 901 def load_mime_types_from_cache! raise ArgumentError, "No RUBY_MIME_TYPES_CACHE set." unless cache_file return false unless File.exists? cache_file begin data = File.read(cache_file) container = Marshal.load(data) if container.version == VERSION @__types__ = Marshal.load(container.data) true else false end rescue => e warn "Could not load MIME::Types cache: #{e}" false end end
# File lib/mime/types.rb, line 711 def match(pattern) matches = @type_variants.select { |k, v| k =~ pattern } if matches.respond_to? :values matches.values.flatten else matches.map { |m| m.last }.flatten end end
# File lib/mime/types.rb, line 705 def prune_matches(matches, flags) matches.delete_if { |e| not e.complete? } if flags[:complete] matches.delete_if { |e| not e.platform? } if flags[:platform] matches end
# File lib/mime/types.rb, line 921 def write_mime_types_to_cache write_mime_types_to_cache! if cache_file end
# File lib/mime/types.rb, line 925 def write_mime_types_to_cache! raise ArgumentError, "No RUBY_MIME_TYPES_CACHE set." unless cache_file File.open(cache_file, 'w') do |f| cache = MIME::Types::CacheContainer.new(VERSION, Marshal.dump(__types__)) f.write Marshal.dump(cache) end true end