The Zope MIME Infrastructure

This package provides a way to work with MIME content types. There are several interfaces defined here, many of which are used primarily to look things up based on different bits of information.

The basic idea behind this is that content objects should provide an interface based on the actual content type they implement. For example, objects that represent text/xml or application/xml documents should be marked mark with the IContentTypeXml interface. This can allow additional views to be registered based on the content type, or subscribers may be registered to perform other actions based on the content type.

One aspect of the content type that’s important for all documents is that the content type interface determines whether the object data is interpreted as an encoded text document. Encoded text documents, in particular, can be decoded to obtain a single Unicode string. The content type intefaces for encoded text must derive from IContentTypeEncoded. (All content type interfaces derive from IContentType and directly provide IContentTypeInterface.)

The default configuration provides direct support for a variety of common document types found in office environments.

Supported lookups

Several different queries are supported by this package:

  • Given a MIME type expressed as a string, the associated interface, if any, can be retrieved using:

    # `mimeType` is the MIME type as a string
    interface = queryUtility(IContentTypeInterface, mimeType)
    
  • Given a charset name, the associated ICodec instance can be retrieved using:

    # `charsetName` is the charset name as a string
    codec = queryUtility(ICharsetCodec, charsetName)
    
  • Given a codec, the preferred charset name can be retrieved using:

    # `codec` is an `ICodec` instance:
    charsetName = getUtility(ICodecPreferredCharset, codec.name).name
    
  • Given any combination of a suggested file name, file data, and content type header, a guess at a reasonable MIME type can be made using:

    # `filename` is a suggested file name, or None
    # `data` is uploaded data, or None
    # `content_type` is a Content-Type header value, or None
    #
    mimeType = getUtility(IMimeTypeGetter)(
        name=filename, data=data, content_type=content_type)
    
  • Given any combination of a suggested file name, file data, and content type header, a guess at a reasonable charset name can be made using:

    # `filename` is a suggested file name, or None
    # `data` is uploaded data, or None
    # `content_type` is a Content-Type header value, or None
    #
    charsetName = getUtility(ICharsetGetter)(
        name=filename, data=data, content_type=content_type)