Ошибка при парсинге JSON. Ajax upload

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

Всем доброго дня! Народ, подскажите пожалуйста. Установил данное расширение для загрузки файлов (ajax). https://www.yiiframework.com/extension/ ... oad-widget

настроил согласно инструкции. при загрузке картинок получаю ошибку SyntaxError: Unexpected token < in JSON at position 0

не могу понять откуда она берется. в коде расширения ничего не менял. Подскажите пожалуйста, что за проблема?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

Не написали actionUpload() для приёма файлов из Ajax-запросов в 'url' => ['upload'].
Вот фреймворк вам и возвращает <html><body>Error 404 Not Found</body></html> вместо JSON-ответа экшена.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

ElisDN писал(а): 2019.05.29, 19:26 Не написали actionUpload() для приёма файлов из Ajax-запросов в 'url' => ['upload'].
Вот фреймворк вам и возвращает <html><body>Error 404 Not Found</body></html> вместо JSON-ответа экшена.
Дмитрий, это не так! В том то и дело, что написал. Хочу вывести массив отправляемых на экшн файлов. Выбрал 3 файла например, на экшн приходит лишь один, и постоянно вылазит эта ошибка. Не понимаю что не так

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


public function actionUpload()
    {
        
        echo '<pre>';
        print_r( $_FILES );
        echo '</pre>';
        
    }

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

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


<pre>Array
(
    [files] => Array
        (
            [name] => Array
                (
                    [0] => Tulips.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/php2Zsxak
                )

            [error] => Array
                (
                    [0] => 0
                )

            [size] => Array
                (
                    [0] => 639304
                )

        )

)
</pre>

для другого файла еще одно обращение к экшену и т.д. На мой взгляд это как-то странно. Не оптимизировано что-ли. Вроде как лучше за один раз взять и отправить массив всех файлов за раз. Ошибка никуда не девается! response от сервера в каждом обращении параметры отправляемого файла.

На сколько это правильно реализовано (почему отправляется не массив файлов, а по одной штуке, да еще и обращение к экшену дублируется в зависимости от кол-ва зугруженных файлов), ну и не ясна ошибка мне. Кто-то наверное юзал данное расширение? поделитесь пожалуйста
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение urichalex »

Действие должно возвращать JSON
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

каким образом мне это прописать? Одно дело, когда например я получаю POST данные и могу как вариант их прогнать через json_decode, а тут каким образом поступать? тут не приходят ни пост ни гет данные, все пусто и лезет эта ошибка.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение urichalex »

return $this->asJson(['alala' => 'elele']);
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

urichalex писал(а): 2019.05.30, 12:29 return $this->asJson(['alala' => 'elele']);
это ясно, а как именно массив картинок получить из этого примера? Я говорю, что мне не понятно, почему на каждую картинку идет аякс запрос на экшен upload, а не за один раз.

С приминением return $this->asJson(['alala' => 'elele']);
ошибка появляется следующая Empty file upload result
как подтавить данные именно отправляемых файлов, и можно ли исключить аякс запрос на каждую картинку и передать массив за раз?*
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

espltdmh50 писал(а): 2019.05.30, 13:22 Я говорю, что мне не понятно, почему на каждую картинку идет аякс запрос на экшен upload, а не за один раз.
Выберет человек через Ctrl+A у себя из папки все 100 фоток по 3 мегабайта и у вас сервер ляжет от одного запроса в 300 МБ. Поэтому по одному загружать надёжнее.
espltdmh50 писал(а): 2019.05.30, 13:22 С приминением return $this->asJson(['alala' => 'elele']);
ошибка появляется следующая Empty file upload result
Логично, так как вам надо вернуть ответ в формате, нужном этому jQuery-плагину.

Как указано, этот компонент - всего лишь Yii-виджет для вывода jQuery-File-Upload. Так что инструкцию смотрим в Wiki плагина.
espltdmh50 писал(а): 2019.05.30, 13:22 можно ли исключить аякс запрос на каждую картинку и передать массив за раз?
Заходим на страницу Options и видим опцию singleFileUploads. Её и переопределяем в 'clientOptions' своего кода.
espltdmh50 писал(а): 2019.05.30, 13:22 как подтавить данные именно отправляемых файлов
Заходим на страницу Setup и видим примеры jSON-ответов, которые должен вернуть ваш экшен для POST или DELETE запроса.
Последний раз редактировалось ElisDN 2019.05.30, 14:37, всего редактировалось 4 раза.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

Дмитрий, благодарю за подробный ответ, спасибо что разъяснили. Почитаю эту инфу! Всем отозвавшимся спасибо!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

ElisDN писал(а): 2019.05.30, 14:28
espltdmh50 писал(а): 2019.05.30, 13:22 Я говорю, что мне не понятно, почему на каждую картинку идет аякс запрос на экшен upload, а не за один раз.
Выберет человек через Ctrl+A у себя из папки все 100 фоток по 3 мегабайта и у вас сервер ляжет от одного запроса в 300 МБ. Поэтому по одному загружать надёжнее.
espltdmh50 писал(а): 2019.05.30, 13:22 С приминением return $this->asJson(['alala' => 'elele']);
ошибка появляется следующая Empty file upload result
Логично, так как вам надо вернуть ответ в формате, нужном этому jQuery-плагину.

Как указано, этот компонент - всего лишь Yii-виджет для вывода jQuery-File-Upload. Так что инструкцию смотрим в Wiki плагина.
espltdmh50 писал(а): 2019.05.30, 13:22 можно ли исключить аякс запрос на каждую картинку и передать массив за раз?
Заходим на страницу Options и видим опцию singleFileUploads. Её и переопределяем в 'clientOptions' своего кода.
espltdmh50 писал(а): 2019.05.30, 13:22 как подтавить данные именно отправляемых файлов
Заходим на страницу Setup и видим примеры jSON-ответов, которые должен вернуть ваш экшен для POST или DELETE запроса.


Дмитрий, если правильно вас понял, сделал так:

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


<?php $form = ActiveForm::begin(); ?>
        <?= JQueryFileUpload::widget([
                'name' => 'files[]',
                'url' => ['upload', 'someparam' => 'somevalue'], // your route for saving images,
                'appearance'=>'ui', // available values: 'ui','plus' or 'basic'
                'formId'=>$form->id,
                'options' => [
                    'accept' => 'image/*'
                ],
                'clientOptions' => [
                    'maxFileSize' => 2000000,
                    'dataType' => 'json',
                    'acceptFileTypes'=>new yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
                    'autoUpload' => true,
                    'completed' => "js:function(data){ 
                        console.log(data);
                    }",
                ]
            ]); ?>
    <?php ActiveForm::end(); ?> 


В data ничего не приходит, ошибка сохраняется.

shema.jpg
Error SyntaxError: Unexpected token A in JSON at position 0
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

Еще добавил clientEvents. так хотя бы в console.log приходят данные при загрузке картинок! Но ошибка никуда не уходит. Не пойму что еще нужно сделать

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

<?php $form = ActiveForm::begin(); ?>
        <?= JQueryFileUpload::widget([
                'name' => 'files[]',
                'url' => ['upload', 'someparam' => 'somevalue'], // your route for saving images,
                'appearance'=>'ui', // available values: 'ui','plus' or 'basic'
                'formId'=>$form->id,
                'options' => [
                    'accept' => 'image/*'
                ],
                'clientOptions' => [
                    'maxFileSize' => 2000000,
                    'dataType' => 'json',
                    'acceptFileTypes'=>new yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
                    'autoUpload' => true,
                ],
                'clientEvents' => [
                
                    'add' => "function (e, data) {
                        console.log(data);    
                    }",
                
                ]
                
            ]); ?>
    <?php ActiveForm::end(); ?>



Изображение
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

В Developer Tools браузера переключитесь на вкладку Network и посмотрите, что из контроллера возвращается.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

уфф.. интересно что в экшене я могу посмотреть что в $_FILES, но вот с ошибкой этой я вообще не догоняю(

Изображение
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

Ответ от сервера там в Response.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

ну я говорю, что в экшене я просто сделал $_FILES для понимания, что идет туда. В responce норм отдает. но ошибка....

Изображение
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

Ну так замените print_r($_FILES) на return $this->asJson($_FILES)
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

забыл написать.. так пробовал уже. Сразу пишет Error Empty file upload result
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

Ошибки Empty file upload result не будет когда вы вернёте нужный ему JSON.

Ошибка "Unexpected token A" вываливается когда он не-JSON-ответ "Array(...)" из print_r пытается распарсить как JSON.

А так в контроллере получайте $files = UploadedFile::getInstancesByName('files'), сохраняйте в цикле и возвращайте JSON-ответ.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение espltdmh50 »

теперь вообще не врубаю, вот в response отдан json. ошибка опять лезет.

Изображение
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка при парсинге JSON. Ajax upload

Сообщение ElisDN »

Там в {"files": [...]} обёрнуто.
Ответить