Вывод сообщения об ошибке, если загружаемый файл является слишком большим в WordPress

Если вы работали над своими проектами в WordPress, дающими возможность пользователям загружать файлы – видео, изображения, CSV или любые другие типы данных, — то в таком случае вы, скорее всего, сталкивались с ситуацией, когда вам нужно определить, является ли файл слишком большим для WordPress.

Какой файл будет считаться «слишком большим»? Это зависит от нескольких факторов:

  • Размер файла больше, чем вы хотите принимать (или принимает файловая система)
  • При загрузке файла происходит PHP таймаут (из-за размера файла)
  • Файловая система не имеет достаточного места
  • И т.д.

Вне зависимости от происходящих событий вы должны быть в состоянии сделать следующее:

  1. Определить, вписывается ли файл в ограничения системы (независимо от ограничений).
  2. Вывести на экран сообщение об ошибке пользователю перед тем, как произойдет загрузка.

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

Файл слишком большой для WordPress

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

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

1. Задаем хук уведомлений.

Далее идет обычный ООП-код для WordPress:

<?php
class Acme_File_Importer {
 
	public function __construct() {
		add_action( 'admin_notices', array( $this, 'display_admin_notice' ) );
	}
	
	public function display_admin_notice() {
	  // TODO
	}
	
}

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

2. Проверяем размер файла на этапе загрузки

Обратите внимание: следующая функция предполагает, что вы уже имеете правильную обработку, позволяющую определить, заполнен ли массив $_FILES. Т.е., если пользователь пытается загрузить файл, но ничего не задает, то это уже отдельный случай для обработки.

В нашем случае пользователь предоставил файл, поэтому мы делаем следующее:

<?php
 
/**
 * Determines if the given file is too large for the current environment.
 *
 * @return    bool      True if the file is too large; otherwise, false.
 * @access    private
 */
private function file_is_too_large() {
 
  // Read the contents of the file
  $file_contents = file_get_contents( $_FILES['acme_uploaded_file']['tmp_name'] );
  $is_too_large = false;
  
  /* Use your own metric for determining if the file is too large or not
   * and then set a boolean value depending on that result.
   */
   
  return $is_too_large;
 
}

Наличие private функции, вычисляющей размер файла (есть и другие способы проверки типа и размера файла, но это выходит за рамки данной статьи), делает код намного более читабельным.

Таким образом, код, представленный выше, очень легко читается: «если файлы слишком большие, то в таком случае выводим на экран сообщение об ошибке».

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

3. Вывод ошибки (или загрузка файла).

Наконец, мы обновляем подцепленную функцию, определенную выше, чтобы улучшить private функцию, вывести сообщение об ошибке или начать загрузку файла:

<?php
 
/**
 * Renders the appropriate message box based on how the import performs.
 */
public function display_admin_notice() {
 
  if ( $this->file_is_too_large() ) {
 
    /* This would be cleaner if it were an external file that was 
     * brought in via an include_once call, but this is just for
     * example :).
     */
    $html = '<div class="error">';
      $html .= '<p>You are attempting to upload a file that is too large.</p>';
    $html .= '</div>';
 
    echo $html;
 
  }
 
}

Обратите внимание: в коде задана проверка того, является ли файл слишком большим, и если это так, то выводится сообщение об ошибке. Как следует из комментария, мне больше нравится выносить разметку за пределы класса, однако для большей наглядности подойдет и такой вариант.

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

Источник: tommcfarlin.com

Блог про WordPress
Комментарии: 1
  1. Alex_dem

    Загрузка видео на собственный — это непозволительная роскошь для наших простых хостингов. Мне мой провайдер с барского плеча отстегнул всего лишь 2 ГБ выделил. И я, при этом, загрузил уже почти половину одними только статьями и картинками (при том, что у меня сейчас 2 сайта на WP и у каждого чуть более 100 записей). Хотя есть мечта выцарапать у провайдера статический айпишник, установить Апач, выделить старый комп, закинуть на него большой веник и захостить там собственные сайты с сотнями гигабайт жесткого диска! К сожалению, пока дальше мечты дело не дошло. Вот прокачаю сайты, тогда точно займусь! :)

Добавить комментарий

Получать новые комментарии по электронной почте.