[3.2][3.3] Вставка картинок

У вас есть идея для расширения функциональности phpBB? Расскажите о ней здесь!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5557
Стаж: 21 год 8 месяцев
Откуда: Питер
Благодарил (а): 187 раз
Поблагодарили: 776 раз

Re: [3.2][3.3] Вставка картинок

Сообщение Siava »

Михаил Молчанов, добавьте в админке это расширение и будет поддерживать.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Аватара пользователя
Michel
Поддержка
Поддержка
Сообщения: 650
Стаж: 14 лет 8 месяцев
Откуда: Липецк
Благодарил (а): 144 раза
Поблагодарили: 81 раз

Re: [3.2][3.3] Вставка картинок

Сообщение Michel »

Михаил Молчанов писал(а): 18.09.2026 23:53 Форум поддерживает такие фото файлы? jfif
По умолчанию не поддерживает. Но можно попробовать форум заставить поддерживать данный формат. Вопрос зачем? Ведь формат jfif является тем же самым jpeg. Можно изменить окончание файла на jpg и форум его примет как родного.
phpBB 3.3.17 • php 8.5.10 • MySQL(i) 8.0.25-15
Расширения для phpBBСтили для phpBB
Аватара пользователя
Михаил Молчанов
phpBB 1.4.4
Сообщения: 181
Стаж: 2 года 1 месяц
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 7 раз

Re: [3.2][3.3] Вставка картинок

Сообщение Михаил Молчанов »

У меня jfif добавлено через админку. но всё равно не поддерживается
Создал и раскручиваю свой форум! :D

Изображение
Аватара пользователя
Michel
Поддержка
Поддержка
Сообщения: 650
Стаж: 14 лет 8 месяцев
Откуда: Липецк
Благодарил (а): 144 раза
Поблагодарили: 81 раз

Re: [3.2][3.3] Вставка картинок

Сообщение Michel »

Siava писал(а): Вчера 0:08 Михаил Молчанов, добавьте в админке это расширение и будет поддерживать.
В движке phpBB встроена строгая система безопасности, которая сверяет реальный тип файла с его расширением. Для системы расширение .jfif является неизвестным "чужаком", хотя внутри находится стандартный MIME-тип image/jpeg. Чтобы подружить phpBB с форматом .jfif, нужно выполнить два шага: один в панели администратора, а второй — в коде самого форума.
Если просто добавить формат в админке, то при загрузке мы получим ошибку "Несовпадение типа изображения: ожидаемое расширение jpg вместо полученного jfif."

Отправлено спустя 25 минут 26 секунд:
Михаил Молчанов писал(а): Вчера 0:37 У меня jfif добавлено через админку. но всё равно не поддерживается
Измените окончание файла с jfif на jpg и всё.
Так как:
Michel писал(а): Вчера 0:38 а второй — в коде самого форума
Менять код движка не рекомендуется!!!

Отправлено спустя 9 минут 15 секунд:
Но если сильно хочется, то нужно отредактировать файл

Код: Выделить всё

phpbb/files/upload.php
Найти:

Код: Выделить всё

			IMAGETYPE_JPEG		=> ['jpg', 'jpeg'],
Заменить:

Код: Выделить всё

			IMAGETYPE_JPEG		=> ['jpg', 'jpeg', 'jfif'],
Очистить кэш форума! Запомните что данную манипуляцию нужно будет делать каждый раз когда будете обновлять форум!
phpBB 3.3.17 • php 8.5.10 • MySQL(i) 8.0.25-15
Расширения для phpBBСтили для phpBB
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17252
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 587 раз
Поблагодарили: 1781 раз

Re: [3.2][3.3] Вставка картинок

Сообщение rxu »

PredatorZ писал(а): 11.09.2026 16:17 А без дополнительных "регистраций" и условий нет ничего ?


Оно же, но надо проверять на работоспособность.
Re: [3.1][3.2] BB3ImageUpload: загрузка изображений на внешние хостинги изображений
Изображение
Аватара пользователя
Kuskow
phpBB 2.0.6
Сообщения: 505
Стаж: 10 лет 3 месяца
Откуда: 🇰🇿 Караганда
Благодарил (а): 29 раз
Поблагодарили: 48 раз

Re: [3.2][3.3] Вставка картинок

Сообщение Kuskow »

Что-то пользователи без энтузиазма восприняли нововведение. Некоторые сказали, что им недостаточно выбирать файлы, нужен копипаст (перетаскивать выбранные файлы из проводника в окно загрузки понравилось). Но мы с Google-ИИ не стали это реализовывать, а пошли чуть дальше и сделали копипаст изображения прямо в текст сообщения. Теперь можно, например, сделать скриншот и вставить его в своё сообщение, не сохраняя на локальном диске. Или, листая свой web-фотоальбом, скопировать оттуда изображение и вставить в окно редактирования сообщения на форуме. Ну и в проводнике можно выбрать несколько локальных файлов, скопировать список и вставить их прямо в сообщение - файлы загрузятся на сервер, а в окне редактирования появятся ссылки на загруженные файлы, обрамлённые тегами img. Красота красивая!

Кому надо так же, измените код в этом файле. Не забудьте вместо контекста "ЗАМЕНИТЬ_ТОКЕН" подставить своё, что у вас там, чтобы было одинаково со вторым файлом.
Kuskow писал(а): 18.09.2026 5:433️⃣ В папке шаблона /styles/prosilver/template создаём файл fast_upload.js и записываем в него код:

Код: Выделить всё

(function() {
    let globalFileInput = null;
    const SECRET_TOKEN = 'ЗАМЕНИТЬ_ТОКЕН';
    const ORIGINAL_ICON = '<i class="icon fa-cloud-upload fa-fw" aria-hidden="true"></i>';

    function getOrCreateFileInput() {
        if (globalFileInput) return globalFileInput;
        const fileInput = document.createElement('input');
        fileInput.type = 'file';
        fileInput.id = 'fast-image-file-input';
        fileInput.multiple = true;
        fileInput.accept = 'image/*';
        fileInput.style.display = 'none';
        document.body.appendChild(fileInput);
        globalFileInput = fileInput;
        return fileInput;
    }

    // Универсальная функция для отправки файлов на сервер и вставки BB-кодов
    function uploadAndInsertImages(files, newButton, statusSpan, textarea) {
        if (!files || files.length === 0) return;

        const formData = new FormData();
        formData.append('token', SECRET_TOKEN);
        
        for (let i = 0; i < files.length; i++) {
            formData.append('images[]', files[i]);
        }

        // Анимация на кнопке
        if (newButton) {
            newButton.innerHTML = '⏳';
            newButton.disabled = true;
        }
        if (statusSpan) statusSpan.textContent = '⏳';

        fetch('/upload_compress.php', {
            method: 'POST',
            body: formData
        })
        .then(response => {
            if (!response.ok) throw new Error('Ошибка сервера ' + response.status);
            return response.json();
        })
        .then(data => {
            if (data.links && data.links.length > 0) {
                const startPos = textarea.selectionStart;
                const endPos = textarea.selectionEnd;
                const hasTextBefore = textarea.value.substring(0, startPos).trim().length > 0;
                
                let bbcodeInsert = hasTextBefore ? '\r\n\r\n' : '';
                
                data.links.forEach((link, index) => {
                    bbcodeInsert += `[img]${link}[/img]`;
                    if (index < data.links.length - 1) {
                        bbcodeInsert += '\r\n\r\n\r\n';
                    }
                });
                
                bbcodeInsert += '\r\n\r\n';

                const textBefore = textarea.value.substring(0, startPos);
                const textAfter = textarea.value.substring(endPos, textarea.value.length);

                textarea.value = textBefore + bbcodeInsert + textAfter;
                textarea.focus();
                textarea.selectionStart = textarea.selectionEnd = startPos + bbcodeInsert.length;

                if (newButton) newButton.innerHTML = '✅';
                if (statusSpan) statusSpan.textContent = '✅';
            } else {
                if (newButton) newButton.innerHTML = '❌';
                if (statusSpan) statusSpan.textContent = '❌';
            }
        })
        .catch(error => {
            console.error('Ошибка:', error.message);
            if (newButton) newButton.innerHTML = '❌';
            if (statusSpan) statusSpan.textContent = '❌';
        })
        .finally(() => {
            setTimeout(() => { 
                if (newButton) {
                    newButton.innerHTML = ORIGINAL_ICON;
                    newButton.disabled = false;
                }
                if (statusSpan) statusSpan.textContent = '';
            }, 2500);
        });
    }

    function injectUploadButton(colorButton, textarea) {
        if (!colorButton || !textarea || colorButton.parentNode.querySelector('.phpbb-fast-upload-trigger')) return;

        const newButton = document.createElement('button');
        newButton.type = 'button';
        newButton.className = 'button button-icon-only phpbb-fast-upload-trigger';
        newButton.title = 'Загрузить фото';
        newButton.innerHTML = ORIGINAL_ICON;
        newButton.style.marginLeft = '4px';

        colorButton.parentNode.insertBefore(newButton, colorButton.nextSibling);

        // Клик по кнопке (обычный выбор файлов с диска)
        newButton.onclick = function(e) {
            e.preventDefault();
            e.stopPropagation();

            const fileInput = getOrCreateFileInput();
            fileInput.onchange = null;

            fileInput.onchange = function() {
                if (!fileInput.files || fileInput.files.length === 0) return;
                uploadAndInsertImages(fileInput.files, newButton, null, textarea);
                fileInput.value = '';
            };

            fileInput.click();
        };

        // НАЧАЛО БЛОКА КОПИПАСТА (Ctrl+V)
        // Вешаем слушатель события вставки прямо на текстовое поле ввода сообщения
        textarea.addEventListener('paste', function(e) {
            // Проверяем, есть ли бинарные данные (файлы) в буфере обмена
            if (!e.clipboardData || !e.clipboardData.files || e.clipboardData.files.length === 0) {
                return; // Если вставили обычный текст — ничего не делаем, работает стандартно
            }

            const pastedFiles = [];
            for (let i = 0; i < e.clipboardData.files.length; i++) {
                const file = e.clipboardData.files[i];
                // Нам нужны только изображения
                if (file.type.indexOf('image/') !== -1) {
                    pastedFiles.push(file);
                }
            }

            if (pastedFiles.length > 0) {
                // Предотвращаем стандартное поведение браузера (чтобы в textarea не вставился мусор)
                e.preventDefault();
                
                // Запускаем процесс отправки скопированных картинок
                uploadAndInsertImages(pastedFiles, newButton, null, textarea);
            }
        });
        // КОНЕЦ БЛОКА КОПИПАСТА
    }

    function autoScanAndInject() {
        const colorButtons = document.querySelectorAll('[name="bbpalette"], #bbpalette, .bbcode-color');
        if (colorButtons.length > 0) {
            colorButtons.forEach(colorBtn => {
                const parentForm = colorBtn.closest('form') || colorBtn.closest('.quickreply') || colorBtn.closest('#qr_postform') || document;
                const textarea = parentForm.querySelector('textarea');
                if (textarea) {
                    injectUploadButton(colorBtn, textarea);
                }
            });
        }
    }

    autoScanAndInject();
    const observer = new MutationObserver(() => autoScanAndInject());
    observer.observe(document.body, { childList: true, subtree: true });
})();

Вернуться в «Запросы расширений для phpBB»