Метод isMimeType

Метод isMimeType() библиотеки Validator.js предназначен для проверки строки на соответствие формату MIME-типа. MIME-типы используются для описания форматов файлов и содержимого данных при передаче через HTTP, SMTP и другие протоколы.

Метод особенно полезен при:

  • валидации заголовков Content-Type;
  • проверке MIME-типов загружаемых файлов;
  • фильтрации допустимых форматов;
  • разработке API;
  • обработке multipart/form-data;
  • проверке метаданных файлов.

Синтаксис

validator.isMimeType(input)

Параметры

Параметр Тип Описание
input string Проверяемая строка MIME-типа

Возвращаемое значение

Тип Описание
boolean true, если строка является корректным MIME-типом

Подключение библиотеки

Node.js

const validator = require('validator');

ES Modules

import validator from 'validator';

Что такое MIME-type

MIME (Multipurpose Internet Mail Extensions) — стандарт описания типа содержимого.

Структура MIME-типа:

type/subtype

Примеры:

text/html
application/json
image/png
audio/mpeg
video/mp4

Базовые примеры

Корректный MIME-type

import validator from 'validator';

console.log(validator.isMimeType('application/json'));

Результат:

true

MIME для изображения

console.log(validator.isMimeType('image/png'));

Результат:

true

MIME для HTML

console.log(validator.isMimeType('text/html'));

Результат:

true

Некорректные значения

Отсутствует subtype

console.log(validator.isMimeType('application'));

Результат:

false

Отсутствует type

console.log(validator.isMimeType('/json'));

Результат:

false

Неверный разделитель

console.log(validator.isMimeType('application-json'));

Результат:

false

Пустая строка

console.log(validator.isMimeType(''));

Результат:

false

Проверка популярных MIME-типов

JSON

validator.isMimeType('application/json');

XML

validator.isMimeType('application/xml');

PDF

validator.isMimeType('application/pdf');

ZIP

validator.isMimeType('application/zip');

JPEG

validator.isMimeType('image/jpeg');

SVG

validator.isMimeType('image/svg+xml');

MP4

validator.isMimeType('video/mp4');

MP3

validator.isMimeType('audio/mpeg');

MIME-типы с дополнительными суффиксами

Метод корректно обрабатывает MIME-типы со специальными суффиксами.

Пример +json

console.log(
    validator.isMimeType('application/ld+json')
);

Результат:

true

Пример +xml

console.log(
    validator.isMimeType('application/soap+xml')
);

Результат:

true

MIME-типы с vendor-префиксами

Стандарт MIME допускает vendor-форматы.

Пример

console.log(
    validator.isMimeType(
        'application/vnd.ms-excel'
    )
);

Результат:

true

MIME для Microsoft Word

console.log(
    validator.isMimeType(
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    )
);

Результат:

true

Проверка MIME-типа файла

Пример с объектом файла

function validateFile(file) {
    return validator.isMimeType(file.mimetype);
}

const file = {
    name: 'photo.png',
    mimetype: 'image/png'
};

console.log(validateFile(file));

Результат:

true

Проверка Content-Type

Проверка HTTP-заголовка

function validateContentType(contentType) {
    return validator.isMimeType(contentType);
}

console.log(
    validateContentType('application/json')
);

Проверка разрешённых MIME-типов

Одна только проверка формата не гарантирует, что тип разрешён приложением.

Комбинированная проверка

const allowedMimeTypes = [
    'image/png',
    'image/jpeg',
    'image/webp'
];

function isAllowedMimeType(type) {
    return (
        validator.isMimeType(type) &&
        allowedMimeTypes.includes(type)
    );
}

console.log(
    isAllowedMimeType('image/png')
);

Результат:

true

Валидация загружаемых изображений

Проверка изображений

function validateImageUpload(file) {
    const allowed = [
        'image/jpeg',
        'image/png',
        'image/gif'
    ];

    return (
        validator.isMimeType(file.mimetype) &&
        allowed.includes(file.mimetype)
    );
}

Валидация документов

const documentTypes = [
    'application/pdf',
    'application/msword'
];

function validateDocument(type) {
    return (
        validator.isMimeType(type) &&
        documentTypes.includes(type)
    );
}

Использование в Express.js

Middleware проверки MIME-типа

import validator from 'validator';

function validateMime(req, res, next) {
    const type = req.headers['content-type'];

    if (!validator.isMimeType(type)) {
        return res.status(400).json({
            error: 'Invalid MIME type'
        });
    }

    next();
}

Проверка MIME-типа в загрузчике файлов

Пример с Multer

import multer from 'multer';
import validator from 'validator';

const upload = multer({
    fileFilter(req, file, cb) {

        if (!validator.isMimeType(file.mimetype)) {
            return cb(
                new Error('Invalid MIME type')
            );
        }

        cb(null, true);
    }
});

Ограничение только изображениями

function isImageMime(type) {
    return (
        validator.isMimeType(type) &&
        type.startsWith('image/')
    );
}

console.log(
    isImageMime('image/png')
);

Результат:

true

Ограничение только видео

function isVideoMime(type) {
    return (
        validator.isMimeType(type) &&
        type.startsWith('video/')
    );
}

Ограничение только аудио

function isAudioMime(type) {
    return (
        validator.isMimeType(type) &&
        type.startsWith('audio/')
    );
}

Использование с массивами

Фильтрация MIME-типов

const values = [
    'image/png',
    'application/json',
    'wrong/type/',
    'text/html'
];

const valid = values.filter(value =>
    validator.isMimeType(value)
);

console.log(valid);

Результат:

[
    'image/png',
    'application/json',
    'text/html'
]

Проверка пользовательского ввода

function validateUserInput(input) {

    if (!validator.isMimeType(input)) {
        throw new Error('Некорректный MIME-type');
    }

    return true;
}

Проверка API-ответов

function validateApiResponse(response) {

    const contentType =
        response.headers['content-type'];

    return validator.isMimeType(contentType);
}

Особенности метода

Проверяется только формат

Метод:

validator.isMimeType()

проверяет только синтаксическую корректность MIME-типа.

Он не проверяет:

  • существование MIME-типа в стандарте;
  • соответствие содержимого файла;
  • безопасность файла;
  • реальное расширение файла.

Пример потенциальной проблемы

validator.isMimeType('image/not-real-format');

Результат:

true

Строка синтаксически корректна, несмотря на несуществующий subtype.


Проверка содержимого файла

Для реальной проверки типа файла обычно используют:

  • сигнатуры файлов;
  • magic bytes;
  • библиотеки анализа бинарных данных.

Пример:

import fileType from 'file-type';

MIME-type и расширение файла

Расширение файла не всегда соответствует MIME-типу.

Пример

photo.jpg

может иметь MIME:

application/octet-stream

или даже:

text/plain

Часто используемые MIME-типы

MIME-type Назначение
text/plain Текст
text/html HTML
application/json JSON
application/xml XML
application/pdf PDF
image/png PNG
image/jpeg JPEG
audio/mpeg MP3
video/mp4 MP4
application/zip ZIP

Сравнение с регулярным выражением

Проверка через RegExp

const regex =
    /^[a-z]+\/[a-z0-9.+-]+$/i;

Проверка через Validator.js

validator.isMimeType(value);

Преимущества Validator.js:

  • готовая реализация;
  • поддержка edge-case сценариев;
  • единый стиль валидации;
  • поддержка RFC-совместимого формата;
  • меньше вероятность ошибок.

Практический пример комплексной проверки

import validator from 'validator';

const allowedMimeTypes = [
    'image/jpeg',
    'image/png',
    'application/pdf'
];

function validateUpload(file) {

    if (!validator.isMimeType(file.mimetype)) {
        return {
            success: false,
            error: 'Некорректный MIME-type'
        };
    }

    if (
        !allowedMimeTypes.includes(
            file.mimetype
        )
    ) {
        return {
            success: false,
            error: 'Тип файла запрещён'
        };
    }

    return {
        success: true
    };
}

Типичные ошибки

Ошибка №1: проверка только расширения

Небезопасный вариант:

if (filename.endsWith('.png'))

Безопаснее:

validator.isMimeType(file.mimetype)

Ошибка №2: отсутствие whitelist

Неправильно:

validator.isMimeType(type)

Правильно:

allowed.includes(type)

Ошибка №3: доверие данным клиента

Клиент может отправить:

image/png

для исполняемого файла.

Требуется дополнительная серверная проверка содержимого.


Производительность

Метод:

isMimeType()

работает очень быстро, поскольку использует регулярные выражения и не выполняет:

  • чтение файлов;
  • сетевые операции;
  • анализ содержимого;
  • обращения к базе данных.

Совместимость

Метод доступен:

  • в Node.js;
  • в браузере;
  • во frontend-приложениях;
  • в backend-сервисах;
  • в Express.js;
  • в NestJS;
  • в Next.js;
  • в серверных API.

Краткая схема проверки MIME-типа

if (
    validator.isMimeType(type) &&
    allowed.includes(type)
) {
    // MIME-type допустим
}