Метод isMimeType() библиотеки Validator.js предназначен
для проверки строки на соответствие формату MIME-типа. MIME-типы
используются для описания форматов файлов и содержимого данных при
передаче через HTTP, SMTP и другие протоколы.
Метод особенно полезен при:
Content-Type;validator.isMimeType(input)
| Параметр | Тип | Описание |
|---|---|---|
input |
string |
Проверяемая строка MIME-типа |
| Тип | Описание |
|---|---|
boolean |
true, если строка является корректным MIME-типом |
const validator = require('validator');
import validator from 'validator';
MIME (Multipurpose Internet Mail Extensions) — стандарт описания типа содержимого.
Структура MIME-типа:
type/subtype
Примеры:
text/html
application/json
image/png
audio/mpeg
video/mp4
import validator from 'validator';
console.log(validator.isMimeType('application/json'));
Результат:
true
console.log(validator.isMimeType('image/png'));
Результат:
true
console.log(validator.isMimeType('text/html'));
Результат:
true
console.log(validator.isMimeType('application'));
Результат:
false
console.log(validator.isMimeType('/json'));
Результат:
false
console.log(validator.isMimeType('application-json'));
Результат:
false
console.log(validator.isMimeType(''));
Результат:
false
validator.isMimeType('application/json');
validator.isMimeType('application/xml');
validator.isMimeType('application/pdf');
validator.isMimeType('application/zip');
validator.isMimeType('image/jpeg');
validator.isMimeType('image/svg+xml');
validator.isMimeType('video/mp4');
validator.isMimeType('audio/mpeg');
Метод корректно обрабатывает MIME-типы со специальными суффиксами.
+jsonconsole.log(
validator.isMimeType('application/ld+json')
);
Результат:
true
+xmlconsole.log(
validator.isMimeType('application/soap+xml')
);
Результат:
true
Стандарт MIME допускает vendor-форматы.
console.log(
validator.isMimeType(
'application/vnd.ms-excel'
)
);
Результат:
true
console.log(
validator.isMimeType(
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
)
);
Результат:
true
function validateFile(file) {
return validator.isMimeType(file.mimetype);
}
const file = {
name: 'photo.png',
mimetype: 'image/png'
};
console.log(validateFile(file));
Результат:
true
Content-Typefunction validateContentType(contentType) {
return validator.isMimeType(contentType);
}
console.log(
validateContentType('application/json')
);
Одна только проверка формата не гарантирует, что тип разрешён приложением.
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)
);
}
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();
}
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/')
);
}
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;
}
function validateApiResponse(response) {
const contentType =
response.headers['content-type'];
return validator.isMimeType(contentType);
}
Метод:
validator.isMimeType()
проверяет только синтаксическую корректность MIME-типа.
Он не проверяет:
validator.isMimeType('image/not-real-format');
Результат:
true
Строка синтаксически корректна, несмотря на несуществующий subtype.
Для реальной проверки типа файла обычно используют:
Пример:
import fileType from 'file-type';
Расширение файла не всегда соответствует MIME-типу.
photo.jpg
может иметь MIME:
application/octet-stream
или даже:
text/plain
| MIME-type | Назначение |
|---|---|
text/plain |
Текст |
text/html |
HTML |
application/json |
JSON |
application/xml |
XML |
application/pdf |
|
image/png |
PNG |
image/jpeg |
JPEG |
audio/mpeg |
MP3 |
video/mp4 |
MP4 |
application/zip |
ZIP |
const regex =
/^[a-z]+\/[a-z0-9.+-]+$/i;
validator.isMimeType(value);
Преимущества Validator.js:
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
};
}
Небезопасный вариант:
if (filename.endsWith('.png'))
Безопаснее:
validator.isMimeType(file.mimetype)
Неправильно:
validator.isMimeType(type)
Правильно:
allowed.includes(type)
Клиент может отправить:
image/png
для исполняемого файла.
Требуется дополнительная серверная проверка содержимого.
Метод:
isMimeType()
работает очень быстро, поскольку использует регулярные выражения и не выполняет:
Метод доступен:
if (
validator.isMimeType(type) &&
allowed.includes(type)
) {
// MIME-type допустим
}