Не работает загрузка файла на сервер

Не работает данный скрипт только в хуке product_savе. Делал плагин, в нем тот же самый скрипт загрузки - всё пашет, в приложении слайдера тоже. Здесь почему-то нет. Не пойму в чем косяк. При этом сохраняя продукт нормально обновляет мною добавленный столбец в таблице продуктов из <input type="text" name="product[assol_model]" value="{$p.assol_model}">. Сделал это по принципу названия input, поэтому данные в самом хуке не обрабатываю, обрабатыюватся в основном экшене сохранения продукта.

Собственно сам код

// Здесь создаю проверка и создание папки
$model_name = waRequest::post('model_name');
if (is_dir(wa()->getDataPath('data/assol/models/'.$model_name, true)) == false ) { mkdir (wa()->getDataPath('data/assol/models/'.$model_name, true), 0775); }

// здесь грузим фотку
$file = waRequest::file('photo');

try {
$img = $file->waImage()
->resize(100, 100, waImage::INVERSE)
->save(wa()->getDataPath('data/assol/models/', true)."test.jpg");
} catch(Exception $e) {
echo "Файл не является изображением, либо произошла другая ошибка: ".$e->getMessage();
return;
}

6 ответов

  • 0
    Леонид Вакуленко Webasyst 3 октября 2013 02:20 #
    Безумное предположение. У вас в названии хука product_save буква е русская. Проверьте это и заодно о, а и с :)

    Если это не поможет, нужно больше информации. Вызывается ли код вообще? Т.е. die('asdf') в начале кода хука. Если вызывается, надо копать ваш код. На первый взгляд всё ок. Если не вызывается - что-то не так с названием хука или в коде приложения, и надо копать там.
  • 0
    Алексей 3 октября 2013 03:25 #
    Дело в том, что код на создание папки работает нормально, т.е. папки создаются и подхватыется значение $model_name со страницы редактирования продукта. Вообще это собственно весь код хука сохранения товара.

    Вот код хука backend_product. Всё выводится как нужно. Но файл фотки не подгружается. Вообще планирую грузить архив и распаковывать, но это не заработало, решил проверить тупо с фоткой. Фотка тоже не грузится. Parsing Error.

    $product = new shopProduct(waRequest::get('id', 0, waRequest::TYPE_INT));

    $product_model = new shopProductModel();
    $products = $product_model->order('id')->fetchAll();

    foreach ($products as $p) {
    if ($p['id'] == $product->id) {
    $assol_model = $p['assol_model'];
    }
    }

    return array(
    'edit_basics' => '
    <div class="field">
    <div class="value">
    <h1>Добавьте модель дивана созданную в программе Ассоль-Дизайню.</h1>
    <div class="field-group">
    <div class="field">
    <div class="name">Выберите zip архив с файлами модели</div>
    <div class="value"><input type="file" name="photo"></div>
    </div>
    <div class="field">
    <div class="name">Название модели</div>
    <div class="value"><input type="text" name="product[assol_model]" value="'.$assol_model.'"></div>
    <input type="hidden" name="model_name" value="'.$assol_model.'">
    </div>
    </div>
    </div>
    </div>',
    );
  • 0
    Леонид Вакуленко Webasyst 3 октября 2013 04:29 #
    Возможно, летит exception из waRequest::file('photo'). В этом случае он появится в логах. Посмотрите Event handling error в wa-log/error.log
  • 0
    Алексей 3 октября 2013 04:42 #
    Не летит вроде, т.к. если бы летел, то и на страница с ошибкой вылезала бы. А тут просто parse error. В любом случае в логах ничего нет. Для уверенности отчистил логи и проделал операцию несколько раз, папка создается, изображения нету :/
    • 0
      Леонид Вакуленко Леонид Вакуленко Webasyst 3 октября 2013 04:47 #
      А, так там есть parse error! Где, как, что говорит?
    • 0
      Леонид Вакуленко Леонид Вакуленко Webasyst 3 октября 2013 04:50 #
      Я, кажется, понял. Из-за echo "Файл не является изображением, ..." ломается JSON, который возвращается контроллером сохранения. Отсюда parseerror.

      Ищите ошибку в ответе сервера на вкладке Network в FireBug'е или Chrome Devtools.
      • 0
        Алексей Алексей 3 октября 2013 05:33 #
        ParseError вылетает рядмо с кнопкой сохранения.
        • 0
          Владислав Горлов Владислав Горлов Webasyst 3 октября 2013 06:28 #
          зачем echo?
          если это event_handler, то используйте throw $ex. ловить в хендлере ошибку имеет смысл только если надо удалять временные директории/какие-то полусозданные данные.
          При вызове хуков обрабатываются исключения и добавляются в логи ошибок.
          А отладчик в браузере вам скажет, что в ответ приходит невалидный ответ
          Файл не является изображением, либо произошла другая ошибка: ... {status:'ok',data:{...}}
          что явно не JSON
  • 0
    Алексей 3 октября 2013 07:10 #
    • 0
      Алексей Алексей 3 октября 2013 07:11 #
      Убрал echo, parseerror не вылетает. Но в логах теперь file not uploaded, т.е. получается при сохранении не видит подхватывает файл.
      • 0
        Владислав Горлов Владислав Горлов Webasyst 3 октября 2013 07:23 #
        Именно.
        при сохранении данных продукта поля type="file" не загружаются - плагины должны самостоятельно загружать их (как образец - посмотрите на загрузку изображений или файлов продуктов), поскольку это более специфичная задача, чем простое сохранение текстовых данных.
        • 0
          Алексей Алексей 3 октября 2013 07:51 #
          Да. но ведь всё на странице продукта обрабатывается <form action="?module=product&amp;action=save" method="post" id="s-product-save"> , а поэтому выводя даже всё в своем экшене, я не получу данные из этого post, а моя post форма работать не будет:/ Т.е. либо отдельной страницей в товаре создавать, либо поподробней о загрузке, пожалуйста.
      • 0
        Алексей Алексей 3 октября 2013 07:27 #
        $file = waRequest::file('photo');

        if ($file->uploaded()) {
        try {
        // create waImage
        $img = $file->waImage();
        } catch(Exception $e) {
        throw new Exception(_w("File isn't an image"));
        }
        $path = wa()->getDataPath('data/assol/models/'.$model_name, true);
        $file_name = 'somename.'.$file->extension;
        $file->moveTo($path, $file_name);
        } else { throw new Exception(_w("File not uploaded")); }

        Почему может не подхватывать файл?
  • 1
    Та же беда, при попытке заслать файл через форму на странице настроек файл не передается.
    Остальные поля формы передаются, обрабатываются,сохраняются, всё ок, а вот файл не загружается.
    Ув. разработчики, поясните пожалуйста, в чем может быть проблема.
    Код аналогичен описанному выше (от Алексея Кремнева), и та же ошибка - файл не загружен.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите