Как написать в текстовый файл и сохранить его в папке для последующей загрузки?

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

У меня есть файл шаблона в папке ‘templates’, который выполняет функцию в зависимости от входных данных JSON, которые он получает из внешнего источника.

Я хочу записать эти входные данные JSON в текстовый файл и сохранить его где-то. А затем позже получить к нему доступ через другую страницу по URL-адресу браузера.

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

Том прав. Я не стал бы советовать это делать.

Тем не менее… Вот как я это делал ранее 😉

Хотя это довольно обширно.


Шаг 1 – Вырежьте отверстие в коробке

  1. Добавьте файл с названием ‘custom-upload-file.php’ в свою папку темы WordPress и добавьте к нему следующее:
<?php
// Получаем заголовок, чтобы сделать функции WordPress доступными
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

$errors       = [];
$confirmation = [];
$post_id      = '';

if( is_user_logged_in() ):

  // Проверяем, что post_id установлен
  if( ! empty( $_POST['post_id'] ) ):
    $post_id = $_POST['post_id'];

    $docs_folder = $_SERVER['DOCUMENT_ROOT'] . '/wp-content/uploads/custom-uploaded-files';
    // Проверяем, существует ли папка для документов
    if( file_exists( $docs_folder ) ):

      // Создаем папку, если она не существует
      if( ! file_exists( $docs_folder . '/post' . $post_id ) ):
        $folder_created = mkdir( $docs_folder . '/post' . $post_id );
        if( ! $folder_created ):
          $errors[] = 'Папка назначения не существует и не может быть создана.';
        endif; // if( $folder_created ):
      endif; // if( file_exists( $docs_folder . '/post' . $post_id ) ):

      // Проверяем, что папка существует (что она всегда будет, теперь)
      if( file_exists( $docs_folder . '/post' . $post_id ) ):

        // Проверяем, что файл не пустой
        if( ! empty( $_FILES['files']['name'][0] ) ):
          $sanitized_filename = filter_var( $_FILES['files']['name'][0], FILTER_SANITIZE_URL );
          $approved_formats   = array(
            'jpg',
            'jpeg',
            'png',
            'gif',
            //          'mov',
            //          'avi',
            'mpg',
            //          '3gp',
            //          '3g2',
            //          'midi',
            //          'mid',
            'pdf',
            'doc',
            'ppt',
            'odt',
            'pptx',
            'docx',
            //          'pps',
            //          'ppsx',
            'xls',
            'xlsx',
            //          'key',
            //          'mp3',
            //          'ogg',
            //          'flac',
            //          'm4a',
            //          'wav',
            //          'mp4',
            //          'm4v',
            //          'webm',
            //          'ogv',
            //          'flv'
          );

          $fileinfo  = pathinfo( $sanitized_filename );
          $extension = $fileinfo['extension'];

          if( in_array( $extension, $approved_formats ) ):

            // Определяем имя файла
            $counter                      = 1;
            $file_name_path_not_available = true;
            $filename                     = $fileinfo['filename'];
            $filename_modification        = '';
            while( $file_name_path_not_available ):
              if( file_exists( $docs_folder . '/post' . $post_id . "https://wordpress.stackexchange.com/" . $filename . $filename_modification . '.' . $extension ) ):
                $filename_modification = '-' . $counter;
                $counter ++;
              else:
                $file_name_path_not_available = false;
              endif; // if( file_exists( $docs_folder . '/post' . $post_id . "https://wordpress.stackexchange.com/" . $fileinfo['basename'] ) ):
            endwhile; // while( $file_name_path_not_available ):

            // Сохраняем файл
            $file_uploaded = move_uploaded_file( $_FILES['files']['tmp_name'][0], $docs_folder . '/post' . $post_id . "https://wordpress.stackexchange.com/" . $filename . $filename_modification . '.' . $extension );
            if( $file_uploaded ):
              $file_info_array = array(
                'uploaded_by' => get_current_user_id(),
                'file_name' => $filename . $filename_modification . '.' . $extension
              );
              add_post_meta( $post_id, 'fileupload', serialize( $file_info_array ) );
              $confirmation[] = 'Файл был сохранен.';
            else:
              $errors[] = 'Ошибка. Файл не был сохранен.';
            endif; // if( $file_saved ):

          else:
            $errors[] = 'Ошибка. Формат загруженного файла не был разрешен. Пожалуйста, попробуйте другой формат.';
          endif; // if( in_array( $extension, $approved_formats ) ):

        else:
          $errors[] = 'Файл не был выбран.';
        endif; // if( !empty( $_POST['file'] ) ):
      endif; // if( file_exists( $docs_folder . '/post' . $post_id ) ):

    else:
      $errors[] = 'Папка назначения не существует и не может быть создана.';
    endif; // if( file_exists( $folder ) ):

  else:
    $errors[] = "Post-ID был пустым, поэтому невозможно определить, где он должен быть сохранен.";
  endif; //  if( !empty( $_POST['post_id'] ) ):

else:
  $errors[] = "Вы не вошли в систему.";
endif; // if( ! is_user_logged_in() ):

$_SESSION['display_messages']          = true;
$_SESSION['upload_errors']       = $errors;
$_SESSION['upload_confirmation'] = $confirmation;

header( 'Location: ' . $_SERVER['HTTP_REFERER'] );
exit();
?>

Это проверяет множество вещей. Я попытался добавить несколько хороших комментариев.


Шаг 2 – Положите свои вещи в коробку

Теперь создайте пользовательский шаблон страницы, снова в папке вашей темы, и назовите его page-upload-file.php. Затем вставьте это внутрь этого файла:

<?php
/**
 * Имя шаблона: Шаблон загрузки файла
 */

get_header(); ?>

<main>

  <div class="container-fluid">
    <div class="container">
      <div class="row">
        <div class="col-8">

          <h1>
            <?php the_title(); ?>
          </h1>

          <div class="entry-content">
            <?php the_content(); ?>
          </div>

        </div>
        <!-- /.col-8 -->

        <div class="col-4">
          <form action="<?php echo get_stylesheet_directory_uri() . '/custom-upload-file.php'; ?>" method="post" enctype="multipart/form-data">
            <input class="upload__file-button" type="file" name="files[]">
            <!-- /.upload__files-label -->
            <input type="hidden" name="post_id" value="<?php echo get_the_id(); ?>">
            <input type="submit" value="Загрузить">
          </form>
        </div>
        <!-- /.col-4 -->

      </div>
      <!-- /.row -->
    </div>
    <!-- /.container -->
  </div>
  <!-- /.container-fluid -->

</main>

<?php get_footer(); ?>

Шаг 3 – Попросите ее открыть коробку

Затем создайте новую страницу и установите новый шаблон страницы. И попробуйте это сделать.

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

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

Как записать JSON в текстовый файл и сохранить его в папке для дальнейшей загрузки

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

Шаг 1. Создание PHP-файла для обработки JSON

Для начала необходимо создать файл, который будет принимать JSON-данные и сохранять их в текстовый файл. Создайте файл с именем save_json.php в папке вашей темы WordPress.

<?php
// Включаем необходимые функции WordPress
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

if( isset($_POST['json_data']) && is_user_logged_in() ) {
    // Получаем данные JSON
    $json_data = $_POST['json_data'];
    $post_id = $_POST['post_id']; // ID поста, к которому может относиться файл

    // Задаем папку для хранения файлов
    $upload_dir = wp_upload_dir();
    $folder_path = $upload_dir['basedir'] . '/custom-json-files/post-' . $post_id;

    // Проверяем, существует ли папка, и создаем ее, если нет
    if (!file_exists($folder_path)) {
        mkdir($folder_path, 0755, true);
    }

    // Уникальное имя файла
    $filename = $folder_path . '/data-' . time() . '.txt';

    // Записываем данные в файл
    if (file_put_contents($filename, $json_data) !== false) {
        echo json_encode(['status' => 'success', 'message' => 'Файл успешно сохранён.']);
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Ошибка при сохранении файла.']);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'Неверные данные или пользователь не авторизован.']);
}
?>

Шаг 2. Создание формы для отправки JSON

Теперь создайте интерфейс для отправки JSON-данных. Это можно сделать в любом месте вашего сайта, создав новую страницу с PHP-кодом:

<?php
/**
 * Шаблон страницы для сохранения JSON
 */

get_header(); ?>

<main>
    <form id="jsonForm">
        <textarea name="json_data" placeholder="Введите ваши JSON данные" required></textarea>
        <input type="hidden" name="post_id" value="<?php echo get_the_ID(); ?>">
        <input type="submit" value="Сохранить">
    </form>
    <div id="responseMessage"></div>
</main>

<script>
document.getElementById('jsonForm').onsubmit = function(event) {
    event.preventDefault();
    var formData = new FormData(this);
    fetch('<?php echo get_stylesheet_directory_uri(); ?>/save_json.php', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        document.getElementById('responseMessage').innerText = data.message;
    });
};
</script>

<?php get_footer(); ?>

Шаг 3. Доступ к сохранённым файлам

Чтобы обеспечить доступ к сохранённым файлам, вам потребуется настроить URL. Ваша структура папок будет следующей:

/wp-content/uploads/custom-json-files/post-[post_id]/data-[timestamp].txt

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

$file_url = $upload_dir['baseurl'] . '/custom-json-files/post-' . $post_id . '/data-' . $timestamp . '.txt';

Безопасность

  1. Проверка пользователей: Убедитесь, что только авторизованные пользователи могут отправлять JSON-данные.
  2. Санитизация вводимых данных: Используйте функции очистки, например sanitize_textarea_field() для текстовых данных, чтобы предотвратить уязвимости.
  3. Права доступа к файлам: Убедитесь, что папка с загруженными файлами имеет правильные права доступа (например, 755 или 750), чтобы предотвратить несанционированный доступ.

Заключение

Теперь у вас есть функционал для записи JSON-данных в текстовый файл, их сохранения и получения через ссылку. Следуя приведённым инструкциям, вы сможете реализовать данный подход в вашем проекте. Не забывайте о мерах безопасности и оптимизации для надежной работы вашего приложения.

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

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