PHP Classes

mimey PHP MIME Type Conversion: Convert between file extensions and MIME types

Recommend this page to a friend!
  Info   View files Documentation   View files View files (46)   DownloadInstall with Composer Download .zip   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2024-04-29 (17 hours ago) RSS 2.0 feedNot enough user ratingsTotal: 34 This week: 1All time: 10,969 This week: 78Up
Version License PHP version Categories
mimey 2.1.0MIT/X Consortium ...8.2.0Files and Folders, PHP 8
Description 

Author

This package can convert between file extensions and MIME types.

It can perform several types of operations with MIME types.

Currently, it can:

- Take a string with a file name extension and return the respective MIME type

- Take a string with a MIME type and return the most common file associated name extension

- Return all the recognized MIME types

- Add new types of MIME types and associated file name extensions

Innovation Award
PHP Programming Innovation award nominee
September 2023
Number 2
Some applications need to process many types of files, for instance, when validating and processing file uploads.

One first step to perform file type validation for applications that process files uploaded by the users is to check the extension of the file name.

However, this step is not sufficient to perform file type validation. It is a fast step because it checks the file name and does not need to read the contents.

PHP has the fileinfo extension that provides the function mime_content_type. This function can detect the file type detection by reading the file contents. However, it is limited to the MIME types that the current implementation of this extension supports.

This package provides an alternative approach just for detecting the MIME type of a file based on the file name. It is extensible. So, it can support adding more MIME types to the list of file name extensions it can recognize.



Manuel Lemos
Picture of Eric Sizemore
  Performance   Level  
Innovation award
Innovation award
Nominee: 4x

Winner: 1x

 

Instructions

For anyone using v1.x of Mimey, please see the CHANGELOG and UPGRADING before upgrading to 2.0.0.

Documentation

Mimey

PHP package for converting file extensions to MIME types and vice versa.

Build Status Code Coverage Scrutinizer Code Quality PHPStan Tests Psalm Static analysis Type Coverage Psalm Level SymfonyInsight Latest Stable Version Downloads per Month License

This package uses [httpd]'s [mime.types] to generate a mapping of file extension to MIME type and the other way around. Click here to view the changelog from their svn: [changelog]

The mime.types file is parsed by bin/generate.php and converted into an optimized JSON object in dist/mime.types.min.json which is then wrapped by helper class MimeTypes.

Also provides a generated PHP enum with all mime types and methods to get the extension. Can also be used to get the enum value from an extension.

[httpd]: https://httpd.apache.org/docs/current/programs/httpd.html [mime.types]: https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types [changelog]: https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=log

Usage

$mimes = new MimeTypes;

// Convert extension to MIME type:
$mimes->getMimeType('json'); // application/json

// Convert MIME type to extension:
$mimes->getExtension('application/json'); // json

Using the enum

$json = MimeType::ApplicationJson;
echo $json->getExtension(); // json
echo $json->value; // application/json

$html = MimeType::fromExtension('html');
echo $html->value; // text/html

MimeType::fromExtension('asdf'); // throws an InvalidArgumentException if the extension cannot be found

Getting All

It's rare, but some extensions have multiple MIME types:

// Get all MIME types for an extension:
$mimes->getAllMimeTypes('wmz'); // array('application/x-ms-wmz', 'application/x-msmetafile')

However, there are many MIME types that have multiple extensions:

// Get all extensions for a MIME type:
$mimes->getAllExtensions('image/jpeg'); // array('jpeg', 'jpg', 'jpe')

Custom Conversions

You can add custom conversions by changing the mapping that is given to MimeTypes.

There is a Mapping\Builder that can help with this:

use Esi\Mimey\Mapping\Builder;

// Create a builder using the built-in conversions as the basis.
$builder = Builder::create();

// Add a conversion. This conversion will take precedence over existing ones.
$builder->add('custom/mime-type', 'myextension');

$mimes = new MimeTypes($builder->getMapping());
$mimes->getMimeType('myextension'); // custom/mime-type
$mimes->getExtension('custom/mime-type'); // myextension

You can add as many conversions as you would like to the builder:

$builder->add('custom/mime-type', 'myextension');
$builder->add('foo/bar', 'foobar');
$builder->add('foo/bar', 'fbar');
$builder->add('baz/qux', 'qux');
$builder->add('cat/qux', 'qux');
...

Optimized Custom Conversion Loading

You can optimize the loading of custom conversions by saving all conversions to a compiled PHP file as part of a build step.

// Add a bunch of custom conversions.
$builder->add(...);
$builder->add(...);
$builder->add(...);
...
// Save the conversions to a cached file.
$builder->save($cacheFilePath);

The file can then be loaded to avoid overhead of repeated $builder->add(...) calls:

// Load the conversions from a cached file.
$builder = Builder::load($cacheFilePath);
$mimes = new MimeTypes($builder->getMapping());

Install

Compatible with PHP >= 8.2.

composer require esi/mimey

Credits

This fork uses the same license as the original repository by @ralouphie (MIT). This repository is a fork of elephox-dev/mimey which itself was a fork of ralouphie/mimey. Thanks to them and all the contributors!

Submitting bugs and feature requests

Bugs and feature requests are tracked on GitHub

Issues are the quickest way to report a bug. If you find a bug or documentation error, please check the following first:

  • That there is not an Issue already open concerning the bug
  • That the issue has not already been addressed (within closed Issues, for example)

Contributing

Missing a MIME type?

Open an issue or even add it yourself! The process is very easy:

  1. fork this repository
  2. add your MIME type to the `data/mime.types.custom` file (make sure it's properly formatted!)
  3. push your changes
  4. submit a pull request

More information for contributions in CONTRIBUTING.

Author

Eric Sizemore - <admin@secondversion.com> - <https://www.secondversion.com>

License

Mimey is licensed under the MIT License - see the LICENSE.md file for details.


  Files folder image Files  
File Role Description
Files folder image.github (3 files, 2 directories)
Files folder imagebin (2 files)
Files folder imagedata (2 files)
Files folder imagedist (3 files)
Files folder imagesrc (1 file, 2 directories)
Files folder imagestubs (1 file)
Files folder imagetests (1 file, 1 directory)
Accessible without login Plain text file .php-cs-fixer.dist.php Aux. Auxiliary script
Accessible without login Plain text file .scrutinizer.yml Data Auxiliary data
Accessible without login Plain text file backward-compatibility.md Data Auxiliary data
Accessible without login Plain text file CHANGELOG.md Data Auxiliary data
Accessible without login Plain text file CODE_OF_CONDUCT.md Data Auxiliary data
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file composer.lock Data Auxiliary data
Accessible without login Plain text file CONTRIBUTING.md Data Auxiliary data
Accessible without login Plain text file LICENSE.md Lic. License text
Accessible without login Plain text file phpstan-baseline.neon Data Auxiliary data
Accessible without login Plain text file phpstan.neon Data Auxiliary data
Accessible without login Plain text file phpunit.xml Data Auxiliary data
Accessible without login Plain text file psalm.xml Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation
Accessible without login Plain text file renovate.json Data Auxiliary data
Accessible without login Plain text file SECURITY.md Data Auxiliary data
Accessible without login Plain text file UPGRADING.md Data Auxiliary data

 Version Control Unique User Downloads Download Rankings  
 100%
Total:34
This week:1
All time:10,969
This week:78Up