AJAX загрузчик изображений на fastpic.ru

lufton

Пользователь
Не знаю, делал кто-то или нет, но решил, что быстрее сделать самому, чем искать по форуму. Мод добавляет поле для загрузки изображений в конструкторе шаблонов. После AJAX загрузки мод заменит значение предыдущего поля конструктора на прямой URL к картинке на fastpic.ru.
Это мой первый мод и вообще первый опыт знакомства с движком, так что не судите строго. Надеюсь кому-то станет полезным. По желанию могу написать загрузку на другие сервисы.
Для установки
  1. Замените в ajax.php:
    PHP:
    $ajax = new TorrentPier\Legacy\Ajax();
    на
    PHP:
    class Ajax extends TorrentPier\Legacy\Ajax {
        function __construct() {
            parent::__construct();
            $this->valid_actions['ajax_load_pic'] = ['user'];
        }
        function init() {
            parent::init();
            if (!$this->action) $this->action = $_GET['action'];
        }
        function ajax_load_pic() {
            $data = array(
                'file[]' => new CurlFile($_FILES['img']['tmp_name']),
                'uploading' => '1'
            );
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_HEADER, 1);
            curl_setopt($ch, CURLOPT_NOBODY, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_URL, 'https://fastpic.ru/uploadmulti');
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            $result = curl_exec($ch);
            preg_match('/http.*html/', $result, $matches);
            curl_setopt($ch, CURLOPT_URL, $matches[0]);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_NOBODY, 0);
            $result = curl_exec($ch);
            preg_match('/(https?.*?fastpic.ru\/big.*?)"/', $result, $matches);
            $this->response['url'] = $matches[1];
            curl_close($ch);
        }
    }
    
    $ajax = new Ajax();
  2. Добавьте в конце styles\templates\posting_tpl.tpl:
    HTML:
    <!--ajax_load_pic_btn-->
    [/LIST]
    <script>TPL.el_id = Object.assign({ajax_load_pic_btn: 'AJAX загрузка на fastpic.ru'}, TPL.el_id);</script>
    <div id="ajax_load_pic_btn">
        <script>
            function ajax_load_pic(el) {
                let fd = new FormData,
                    $el = $(el);
                fd.append('img', $el.prop('files')[0]);
                $.ajax({
                    url: '/ajax.php?action=ajax_load_pic',
                    type: 'POST',
                    dataType: 'json',
                    contentType: false,
                    data: fd,
                    processData: false,
                    success: data => {
                        if ($el.parent().prev().is('input')) $el.parent().prev().val(data.url);
                        $el.val('');
                    }
                });
            }
        </script>
        <input type="file" onchange="ajax_load_pic(this)" />
    </div>
    <!--/ajax_load_pic_btn-->
    Пример работы:
 
Последнее редактирование:

lufton

Пользователь
К сожалению не знаю как можно отредактировать свой первый пост и название темы, поэтому выкладываю следующим обновлённую версию.
Из изменений:
  • добавлен сервис imageban.ru
  • добавлен сервис *******.host
  • добавлен селектор выбора сервиса в конструкторе
  • добавлено поле выбора размера изображения в конструкторе
  • оптимизация кода
ajax.php:
PHP:
class Ajax extends TorrentPier\Legacy\Ajax {
    function __construct() {
        parent::__construct();
        $this->valid_actions['ajax_load_pic'] = ['user'];
    }
    function ajax_load_pic() {
        $ch = curl_init();
        $tmp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $_FILES['img']['name'];
        move_uploaded_file($_FILES['img']['tmp_name'], $tmp);
        $file = new CurlFile($tmp);
        $size = $this->request['size'];
        switch ($this->request['service']) {
            case '*******':
                $data = array(
                    'File' => $file,
                    'OriginalFileName' => 'blank.jpg',
                    'MaxSize' => $size,
                    'PrevMaxSize' => 360,
                    'IsPublic' => 'false',
                    'NeedResize' => $size?'true':'false'
                );
                curl_setopt($ch, CURLOPT_URL, 'https://*******.host/Img/SaveImg2');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                $result = json_decode(curl_exec($ch));
                $this->response['url'] = $result->Url;
                break;
            case 'imageban':
                $data = array(
                    'Filedata' => $file,
                    'prew' => $size?$size:160
                );
                curl_setopt($ch, CURLOPT_URL, 'https://imageban.ru/up');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                $result = json_decode(curl_exec($ch));
                $this->response['url'] = $size?$result->files[0]->thumbs:$result->files[0]->link;
                break;
            case 'fastpic':
            default:
                $data = array(
                    'file[]' => $file,
                    'check_orig_resize' => !!$size,
                    'orig_resize' => $size,
                    'uploading' => '1'
                );
                curl_setopt($ch, CURLOPT_URL, 'https://fastpic.ru/uploadmulti');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_HEADER, 1);
                curl_setopt($ch, CURLOPT_NOBODY, 1);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                $result = curl_exec($ch);
                preg_match('/http.*html/', $result, $matches);
                curl_setopt($ch, CURLOPT_URL, $matches[0]);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_NOBODY, 0);
                $result = curl_exec($ch);
                preg_match('/(https?.*?fastpic.ru\/big.*?)"/', $result, $matches);
                $this->response['url'] = $matches[1];
        }
        curl_close($ch);
        unlink($tmp);
    }
}

$ajax = new Ajax();

styles\templates\posting_tpl.tpl:
HTML:
<!--ajax_load_pic_btn-->
<script>TPL.el_id = Object.assign({ajax_load_pic_btn: 'AJAX загрузка картинки'}, TPL.el_id);</script>
<div id="ajax_load_pic_btn">
    <script>
        function ajax_load_pic(el) {
            let $el = $(el),
                $form = $el.closest('form');
            $.ajax({
                url: '/ajax.php',
                type: 'POST',
                dataType: 'json',
                contentType: false,
                data: new FormData($form[0]),
                processData: false,
                success: data => {
                    if ($form.closest('.rel-el').prev().is('input')) $form.closest('.rel-el').prev().val(data.url);
                },
                complete: () => {
                    $el.val('');
                }
            });
        }
    </script>
    <form>
        <select name="service">
            <!-- Поставьте аттрибут selected напротив сервиса загрузки картинок по умолчанию. -->
            <option value="fastpic" selected>fastpic.ru</option>
            <option value="*******">*******.host</option>
            <option value="imageban">imageban.ru</option>
        </select>
        <!-- Укажите размер картики по умолчанию value="640". "0" или "" – без сжатия. -->
        <input type="number" name="size" min="0" value="640" style="width: 4em" />
        <input type="file" name="img" onchange="ajax_load_pic(this)" />
        <input type="hidden" name="action" value="ajax_load_pic" />
    </form>
</div>
<!--/ajax_load_pic_btn-->
 

lufton

Пользователь
Странно. На локалке после внесения соответствующих изменений всё заработало. А на сервере по прежнему не отображаются изменения. Очистил весь кэш из админки.
 

lufton

Пользователь
Странно. На локалке после внесения соответствующих изменений всё заработало. А на сервере по прежнему не отображаются изменения. Очистил весь кэш из админки.
Разобрался сам. Забыл просто удалить старую версию мода. Всё работает.
 

sergey67

Пользователь
А можно подсказочку? Как вывести этот мод в posting_editor, чтобы загрузка постеров была доступна в парсере?
 
Сверху