Как разрешить конкретные расширения и размер файлов для вложений wp_mail?

Вопрос или проблема

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

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

Мой код:

<?php
//Создаем пустой массив.
$errors = array(); 
if($_POST["submit"]) {
    $to = "[email protected]";
    $subject = "Запрос на новые бронирования";
    $hotel = $_POST["hotel_url"];
    $sender = $_POST["sendername"];
    $senderEmail = $_POST["senderEmail"];

    //Проверяем имя и убеждаемся, что это не пустая строка.
    if(empty($sender)){
        //Пустая строка, добавляем ошибку в массив $errors.        
        $errors['sendername'] = "Пожалуйста, введите ваше имя!";
    }

    /*  вложение */   
    move_uploaded_file($_FILES["attachment"]["tmp_name"],WP_CONTENT_DIR .'/uploads/'.basename($_FILES['attachment']['name']));
    $attachments = array(WP_CONTENT_DIR ."/uploads/".$_FILES["attachment"]["name"]);    

    if(empty($errors)){

        $mailBody = "<table border="1">
                       <tr>
                        <th>№</td>
                        <th>Элемент</td>
                        <th>Описание</td>
                       </tr>
                       <tr>
                        <td>01</td>
                        <td>Отель</td>
                        <td>$hotel</td>
                       </tr>
                       <tr>
                        <td>02</td>
                        <td>Имя</td>
                        <td>$sender</td>
                       </tr>
                       <tr>
                        <td>03</td>
                        <td>Электронная почта</td>
                        <td>$senderEmail</td>
                       </tr>
                    </table>";  

        $headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>');

        $mail_sent = wp_mail( $to, $subject, $mailBody, $headers, $attachments );   
    }
}

if ($mail_sent) {
?>
    <p>Запрос отправлен</p>

<?php 
} else {
?>

<form id="" name="" action="<?php echo get_permalink(); ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="hotel_url" value="<?php echo get_permalink();?>" />

    <div class="section-heading"><h6>Ваши данные</h6></div>    
    <div class="label-input-wrapper">
        <div class="form-label">Имя</div>
        <div class="form-input">
            <input type="text" name="sendername"/>
            <?php if(isset($errors['sendername'])) { echo '<span style="color: red">'.$errors['sendername'].'</span>'; } ?>
        </div>
    </div>

    <div class="label-input-wrapper">
        <div class="form-label">Электронная почта</div>
            <div class="form-input">
                <input type="email" name="senderEmail" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" required value="<?PHP if(!empty($errors)) { echo $senderEmail;} ?>"/>
            </div>
    </div>  

    <label for="uploaded_file">Выберите файл для загрузки:</label>
    <input type="file" name="attachment">

    <input type="submit" value="Отправить" name="submit">
</form>

<?php
}
?>

Вышеуказанный код отправляет вложение на мою почту и сохраняет файл в директории загрузок. Я знаю, что мне нужно сделать что-то в этой области /* вложение */, чтобы разрешить конкретные расширения и размер файла, но как это сделать? Например: если я хочу разрешить только .png, .jpg, .pdf и максимальный размер файла — 1 МБ, как я могу это сделать? Где и какой код мне нужно изменить в вышеприведённых кодах?

Добавьте следующее условие перед функциональностью загрузки файла –

$allowedExts = array("pdf", "jpg", "png");

$temp = explode(".", $_FILES["attachment"]["name"]);
$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/pdf")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 1000000)
&& in_array($extension, $allowedExts)) {
  //ваш код загрузки файла и другие вещи
} else {
  echo "Недопустимый файл";
}

Ссылаясь на http://www.w3schools.com/php/php_file_upload.asp

Смотрите раздел ‘Ограничения на загрузку’.

Ответ или решение

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

1. Ограничение по расширениям и размеру файла

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

// Определяем разрешенные расширения
$allowedExts = array("pdf", "jpg", "png");

// Извлекаем расширение загружаемого файла
$temp = explode(".", $_FILES["attachment"]["name"]);
$extension = end($temp);

// Проверяем тип файла, размер и соответствие расширения
if ((($_FILES["attachment"]["type"] == "application/pdf") || 
     ($_FILES["attachment"]["type"] == "image/jpeg") || 
     ($_FILES["attachment"]["type"] == "image/png")) && 
    ($_FILES["attachment"]["size"] < 1000000) && 
    in_array($extension, $allowedExts)) {

    // Здесь будет ваш код загрузки файла
    move_uploaded_file($_FILES["attachment"]["tmp_name"], WP_CONTENT_DIR . '/uploads/' . basename($_FILES['attachment']['name']));
    $attachments = array(WP_CONTENT_DIR . "/uploads/" . $_FILES["attachment"]["name"]);

} else {
    // Обработка ошибок
    $errors['attachment'] = "Недопустимый файл: необходимо выбрать файл с расширением .jpg, .png или .pdf и размером не более 1 Мб.";
}

2. Внедрение изменений в ваш код

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

/*  attachment */
$errors = array(); // Обновляем массив ошибок

// Определяем разрешенные расширения и размеры
$allowedExts = array("pdf", "jpg", "png");
$temp = explode(".", $_FILES["attachment"]["name"]);
$extension = end($temp);

// Проверяем файл перед загрузкой
if ((($_FILES["attachment"]["type"] == "application/pdf") || 
     ($_FILES["attachment"]["type"] == "image/jpeg") || 
     ($_FILES["attachment"]["type"] == "image/png")) && 
    ($_FILES["attachment"]["size"] < 1000000) && 
    in_array($extension, $allowedExts)) {

    move_uploaded_file($_FILES["attachment"]["tmp_name"], WP_CONTENT_DIR . '/uploads/' . basename($_FILES['attachment']['name']));
    $attachments = array(WP_CONTENT_DIR . "/uploads/" . $_FILES["attachment"]["name"]);

} else {
    $errors['attachment'] = "Недопустимый файл: необходимо выбрать файл с расширением .jpg, .png или .pdf и размером не более 1 Мб.";
}

3. Отображение ошибок пользователю

Не забудьте добавить вывод соответствующих сообщений об ошибках в вашем HTML-коде. Например, после формы в случае, если есть ошибки:

if(isset($errors['attachment'])) {
    echo '<span style="color: red">' . $errors['attachment'] . '</span>';
}

Заключение

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

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

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

Капча загружается...