waFiles::readFile() во фронтенде

Столкнулся с проблемой. В бекенде подобную я уже победил, а во фронтенде не могу.

Создал контроллер для плагина с выдачей файлов для скачки.

<?php
class siteFilesPluginFrontendFilesGetController extends waController
{
public function execute()
{
$path = rtrim(waRequest::get('path'), ' /');
$path = wa()->getDataPath($path, true, null, false);
$file = waRequest::get('file');
$path .= '/'.$file;
if (file_exists($path) && is_file($path) && !in_array(waFiles::extension($path), array('php', 'phtml'))) {
waFiles::readFile($path, $file);
} else {
throw new waException("File not found", 404);
}
}
}

Но почему то не определяется тип документа и вместо диалога для сохранения файла печатается все тело файла на странице обернуто в лейаут.

Может нужно отменить установку лейаута для этого контроллера както?

9 ответов

  • 1

    Сам контроллер, кажется, норм (ну, если закрыть глаза на то, что он позволяет прочитать любой файл в системе, кроме указанных расширений).

    Покажите роутинг и URL по которому вы обращаетесь, пытаясь получить файл?

    • +1
      ▀ Сквёрд  ▀ Сквёрд  30 марта 2015 12:03 #

      URL по которому получаю файл: http://thistudio.ru/demo/?path=demos/&file=1.jpg

      <?php
      return array(
      'demo/' => 'frontend/filesGet'
      );

      • +1

        Вроде всё работает. Я сделал себе тестовый плагин, в plugin.php прописал ему

        'handlers' => array( 'routing' => 'routing' ),

        Ваш роутинг разместил в lib/config/routing.php

        Класс плагина у меня пустой. Код контроллера не менял.

        По указанному урлу у меня нормально сохраняется файл из wa-data/public/site/1.jрg

        Ищите, не застряло ли что-то в кеше браузера, в wa-cache и т.п.
        У меня особенное подозрение на кеш браузера в данном случае.

  • -1

    Добрый день.

    Создавайте не контроллер, а экшен с пустым шаблоном. В экшене достаточно просто не использовать setLayout. Заодно, можно и в шаблон что-то вывести, если, например, файл не нашелся. Ну, или у контроллера переопределите метод display, так как он по-умолчанию будет выпихивать еще системные данные в json, и файл будет выдаваться битый.

  • 1
    WA-Master 13 января 2019 13:03 #

    Привет, не совсем понял почему но после waFiles::readFile производится скача как и ожидается но вот колбека нет.

    Как его получить? ведь например loading иконку не повесить так =( если 2 десятка файлов обрабатывать.

    • +1
      ▀ Сквёрд  ▀ Сквёрд  13 января 2019 13:11 #

      Все правильно, это же "скачка" а не загрузка файла на сервер. По спецификации http протокола. Открывается соединение при нажатии по ссылке, где размешен контроллер с методом readFile() и в ответ движок передает заголовки с указанием браузеру открыть диалог сохранения.

      Если нужно сделать прелодер перед скачкой, то нужно это реализовать на javascript

      • +1
        WA-Master WA-Master 13 января 2019 13:15 #

        спасибо, блин но не получается, весь извелся. что то я не понимаю видимо.

        пробовал отправить js форму, не возвращается файл (на сервере она появляется*), просто форму отправляю нет ответа - хмммм

        что не так?

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

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