WP REST API: ограничение размера загружаемых файлов

При работе с WordPress REST API часто возникает задача ограничить размер загружаемых пользователями файлов. Это особенно важно для предотвращения перегрузок сервера и обеспечения безопасности сайта. В данной статье мы подробно разберем, как настроить ограничение размера файлов, загружаемых через REST API, с примерами кода и рекомендациями.

Почему важно ограничивать размер файлов при загрузке через REST API

REST API позволяет загружать медиафайлы, например, изображения и документы, через POST-запросы. Без ограничения размера загружаемых данных сервер может столкнуться с проблемами:

  • Высокое использование ресурсов сервера — большие файлы сильно нагружают процессор и память.
  • Риск DoS-атак — злоумышленники могут пытаться загрузить чрезмерно большие файлы, чтобы вывести сайт из строя.
  • Нарушение пользовательского опыта — при загрузке слишком больших файлов ошибки появляются поздно, что неудобно для пользователей.

Поэтому правильная настройка ограничения размера файлов — обязательный этап при работе с REST API.

Как WordPress обрабатывает загрузку файлов через REST API

В WordPress загрузка файлов через REST API происходит с помощью эндпоинта /wp/v2/media. Основная логика обработки лежит в классе WP_REST_Attachments_Controller. При загрузке происходит проверка типа файла, прав пользователя и размера.

Однако по умолчанию WordPress не накладывает жесткого ограничения на размер файла через REST API, а полагается на настройки PHP и веб-сервера, такие как upload_max_filesize и post_max_size.

Чтобы управлять ограничением на уровне REST API, нужно дополнительно реализовать проверку в хуках REST API.

Ограничение размера файла через фильтр rest_pre_insert_attachment

Фильтр rest_pre_insert_attachment позволяет вмешаться в процесс загрузки файла и проверить параметры до сохранения. Используем его, чтобы проверить размер файла и при превышении лимита вернуть ошибку.

add_filter('rest_pre_insert_attachment', 'wpapi_rest_limit_upload_size', 10, 2);
function wpapi_rest_limit_upload_size($prepared_attachment, $request) {
    $max_size = 5 * 1024 * 1024; // 5 МБ в байтах
    if (isset($_FILES['file'])) {
        $file = $_FILES['file'];
        if ($file['size'] > $max_size) {
            return new WP_Error(
                'rest_upload_too_large',
                sprintf('Максимальный размер файла %d МБ', $max_size / 1024 / 1024),
                array('status' => 413)
            );
        }
    }
    return $prepared_attachment;
}

В этом примере мы устанавливаем лимит в 5 МБ и проверяем размер загружаемого файла. Если файл больше — возвращаем ошибку с HTTP статусом 413 Payload Too Large.

Обработка ошибки на клиенте и вывод сообщения

При использовании REST API с фронтенда (например, через fetch или axios), нужно обработать ответ сервера и вывести понятное сообщение пользователю:

fetch('/wp-json/wp/v2/media', {
    method: 'POST',
    headers: {
        'Authorization': 'Bearer your_token',
    },
    body: formData
})
.then(response => {
    if (!response.ok) {
        return response.json().then(err => Promise.reject(err));
    }
    return response.json();
})
.then(data => {
    console.log('Файл загружен', data);
})
.catch(error => {
    alert(error.message || 'Ошибка при загрузке файла');
});

Дополнительные методы ограничения: PHP и серверные настройки

Кроме кода на уровне REST API важно проверить настройки PHP и веб-сервера:

  • upload_max_filesize — максимальный размер загружаемого файла
  • post_max_size — максимальный размер POST данных
  • Настройки Nginx или Apache, например, client_max_body_size для Nginx

Например, в php.ini можно установить:

upload_max_filesize = 5M
post_max_size = 6M

Это гарантирует, что сервер не примет слишком большие файлы даже если код WordPress их не проверит.

Использование плагинов для ограничения загрузки файлов

Если не хочется писать код самостоятельно, можно использовать плагины, которые добавляют подобные ограничения и расширенные настройки:

  • WP Limit Upload File Size — простой плагин для установки лимита на размер загружаемых файлов
  • Clearfy Pro — оптимизационный плагин, в котором есть функции для безопасности и ограничения загрузок

Плагины удобны, если вы хотите гибко управлять настройками без прямого вмешательства в код.

Итоги и рекомендации

Ограничение размера загружаемых файлов через WP REST API — важный этап настройки безопасности и производительности. Рекомендуется:

  • Устанавливать ограничения в PHP и веб-сервере
  • Добавлять проверку размера через фильтр rest_pre_insert_attachment
  • Обрабатывать ошибки на стороне клиента с понятными сообщениями
  • Использовать плагины для удобства и расширенных возможностей

Следуя этим рекомендациям, вы защитите свой сайт от чрезмерных нагрузок и обеспечите лучшее взаимодействие с пользователями.

Шаблоны для WP Плагины для WP