Загрузка изображений на стороне сервера в редакторе TinyMCE на PHP
Редактор TinyMCE поддерживает локальный выбор файлов и загрузку изображений. Но чтобы сделать эти функции функциональными, вам необходимо выполнить некоторые настройки в параметрах конфигурации TinyMCE. Кроме того, для загрузки файла изображения на сервер требуется обработчик загрузки на стороне сервера. В этом уроке мы покажем вам, как разрешить пользователю загружать изображения в редакторе TinyMCE с помощью PHP .
В этом примере мы рассмотрим процесс обработки загрузки изображений в редакторе TinyMCE с помощью PHP. Также демонстрируется интеграция функции загрузки изображений в TinyMCE с использованием обратного вызова images_upload_handler и скрипта обработчика загрузки PHP. С помощью этой функции пользователь может загружать изображения с компьютера и вставлять их в редактор TinyMCE . Также будет предоставлен дружественный пользовательский интерфейс (UI) для упрощения загрузки изображений путем перетаскивания их с компьютера.
HTML-код
Определите элемент textarea ( myTextarea
), чтобы добавить HTML-редактор TinyMCE на веб-страницу.
< textarea id = "myTextarea" > textarea >
JavaScript-код
Сначала подключите JS-библиотеку плагина TinyMCE.
< скрипт src = "tinymce/tinymce.min.js" >скрипт >
Определите обратный вызов обработчика загрузки изображений с помощью JavaScript.
- Выбранный файл отправляется в серверный скрипт (
upload.php
) для обработки функции загрузки. - Эта функция обработчика загрузки предоставляет 2 события: blobInfo и progress.
- В случае успеха путь к загруженному файлу извлекается из объекта JSON (
json.location
).
const image_upload_handler_callback = (blobInfo, progress) => new Promise ((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.withCredentials = false ;
xhr.open( 'POST' , 'upload.php' );
xhr.upload.onprogress = (e) => {
прогресс(e.loaded / e.total * 100 );
};
xhr.onload = () => {
если (xhr.status === 403 ) {
reject({ message: 'Ошибка HTTP: ' + xhr.status, remove: true });
return ;
}
если (xhr.статус < 200 || xhr.статус >= 300 ) {
reject( 'Ошибка HTTP: ' + xhr.status);
return ;
}
const json = JSON .parse(xhr.responseText);
если (!json || тип json.location != 'string' ) {
reject( 'Недопустимый JSON: ' + xhr.responseText);
return ;
}
разрешить(json.location);
};
xhr.onerror = () => {
reject( 'Загрузка изображения не удалась из-за ошибки XHR-транспорта. Код: ' + xhr.status);
};
const formData = new FormData();
formData.append( 'файл' , blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
});
Инициализируйте TinyMCE и присоедините редактор к элементу textarea, указанному в selector
параметре. Следующие параметры конфигурации включают функцию локального выбора файлов и загрузки изображений в редакторе TinyMCE.
- Включите
image
плагин и добавьте кнопку загрузки изображений на панель инструментов редактора. - Установите URL скрипта обработчика загрузки на стороне сервера (
upload.php
) в опции images_upload_url . После определения этой конфигурации в диалоговом окне изображения появится вкладка «Загрузка». - Установите обратный вызов обработчика загрузки изображений в параметре images_upload_handler .
tinymce.init({
selector: '#myTextarea' ,
плагины: 'изображение' ,
панель инструментов: 'отменить повтор | стили | полужирный курсив | выравнивание по левому краю выравнивание по центру выравнивание по правому краю выравнивание по ширине | отступ отступ | изображение' ,
// без установленного images_upload_url вкладка «Загрузка» не будет отображаться
images_upload_url: 'upload.php' ,
// переопределяем обработчик загрузки по умолчанию для имитации успешной загрузки
обработчик_загрузки_изображений: обработчик_загрузки_изображений_обратный_вызов
});
Обработчик загрузки PHP (upload.php)
Этот upload.php
файл управляет функцией загрузки изображений на стороне сервера с помощью PHP.
- Укажите источники, которым разрешено отправлять HTTP-запросы этому скрипту-обработчику и загружать изображения на сервер.
- Проверяйте источник HTTP-запроса и принимайте только разрешенные источники.
- Проверьте, был ли файл загружен через HTTP POST, используя
is_uploaded_file()
функцию PHP. - Очистите имя входного файла с помощью
preg_match()
функции в PHP. - Проверьте расширение файла с помощью
pathinfo()
функции в PHP. - Загрузите файл на сервер с помощью
move_uploaded_file()
функции в PHP. - Ответьте на успешную загрузку с помощью JSON. Используйте ключ местоположения, чтобы указать путь к сохраненному ресурсу изображения.
// Только этим источникам разрешено загружать изображения
$accepted_origins = array( "http://localhost" , "https://www.codexworld.com" , "http://192.168.1.1" , "http://example.com" );
// Задайте папку для загрузки
$imageFolder = "uploads/" ;
if (isset( $_SERVER [ 'HTTP_ORIGIN' ])) {
// запросы с тем же источником не установят источник. Если источник установлен, он должен быть допустимым.
if ( in_array ( $_SERVER [ 'HTTP_ORIGIN' ], $accepted_origins )) {
header ( 'Access-Control-Allow-Origin: ' . $_SERVER [ 'HTTP_ORIGIN' ]);
} else {
header ( "HTTP/1.1 403 Origin Denied" );
return;
}
}
// Не пытайтесь обработать загрузку по запросу OPTIONS
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'OPTIONS' ) {
header ( "Access-Control-Allow-Methods: POST, OPTIONS" );
return;
}
reset ( $_FILES );
$temp = current ( $_FILES );
if ( is_uploaded_file ( $temp [ 'tmp_name' ])){
/*
Если вашему скрипту необходимо получать файлы cookie, установите images_upload_credentials : true в
конфигурации и включите следующие два заголовка.
*/
// header('Access-Control-Allow-Credentials: true');
// header('P3P: CP="Политики P3P нет."');
// Очистка входных данных
if ( preg_match ( "/([^\w\s\d\-_~,;:\[\]\(\).])|([\.]{2,})/" , $temp [ 'name' ])) {
header ( "HTTP/1.1 400 Недопустимое имя файла." );
return;
}
// Проверка расширения
if (! in_array ( strtolower ( pathinfo ( $temp [ 'name' ], PATHINFO_EXTENSION )), array( "gif" , "jpg" , "jpeg" , "png" ))) {
заголовок( "HTTP/1.1 400 Недопустимое расширение." );
return;
}
// Принять загрузку, если источника не было или если это принятый источник
$filetowrite = $imageFolder . $temp [ 'name' ];
if( move_uploaded_file ( $temp [ 'tmp_name' ], $filetowrite )){
// Определить базовый URL
$protocol = isset( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] == 'on' ? "https://" : "http://" ;
$baseurl = $protocol . $_SERVER [ "HTTP_HOST" ] . rtrim ( dirname ( $_SERVER [ 'REQUEST_URI' ]), "/" ) . "/" ;
// Ответить на успешную загрузку с помощью JSON.
// Используйте ключ местоположения, чтобы указать путь к сохраненному ресурсу изображения.
// { location : '/your/uploaded/image/file'}
echo json_encode (array( 'location' => $baseurl . $filetowrite ));
}else{
header ( "HTTP/1.1 400 Upload failed." );
return;
}
} else {
// Уведомить редактора о том, что загрузка не удалась
header ( "HTTP/1.1 500 Server Error" );
}
?>