- Вопрос или проблема
- Шаг 1 – Вырежьте отверстие в коробке
- Шаг 2 – Положите свои вещи в коробку
- Шаг 3 – Попросите ее открыть коробку
- Ответ или решение
- Как записать JSON в текстовый файл и сохранить его в папке для дальнейшей загрузки
- Шаг 1. Создание PHP-файла для обработки JSON
- Шаг 2. Создание формы для отправки JSON
- Шаг 3. Доступ к сохранённым файлам
- Безопасность
- Заключение
Вопрос или проблема
У меня есть файл шаблона в папке ‘templates’, который выполняет функцию в зависимости от входных данных JSON, которые он получает из внешнего источника.
Я хочу записать эти входные данные JSON в текстовый файл и сохранить его где-то. А затем позже получить к нему доступ через другую страницу по URL-адресу браузера.
Моя проблема в том, что я не знаю, где этот текстовый файл должен храниться, и я скептически отношусь к тому, насколько безопасен этот подход. Примечание: это не плагин, это просто файл php-шаблона, который что-то делает, когда загружается по URL в браузере.
Том прав. Я не стал бы советовать это делать.
Тем не менее… Вот как я это делал ранее 😉
Хотя это довольно обширно.
Шаг 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';
Безопасность
- Проверка пользователей: Убедитесь, что только авторизованные пользователи могут отправлять JSON-данные.
- Санитизация вводимых данных: Используйте функции очистки, например
sanitize_textarea_field()
для текстовых данных, чтобы предотвратить уязвимости. - Права доступа к файлам: Убедитесь, что папка с загруженными файлами имеет правильные права доступа (например, 755 или 750), чтобы предотвратить несанционированный доступ.
Заключение
Теперь у вас есть функционал для записи JSON-данных в текстовый файл, их сохранения и получения через ссылку. Следуя приведённым инструкциям, вы сможете реализовать данный подход в вашем проекте. Не забывайте о мерах безопасности и оптимизации для надежной работы вашего приложения.