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 ответов
Сам контроллер, кажется, норм (ну, если закрыть глаза на то, что он позволяет прочитать любой файл в системе, кроме указанных расширений).
Покажите роутинг и URL по которому вы обращаетесь, пытаясь получить файл?
URL по которому получаю файл: http://thistudio.ru/demo/?path=demos/&file=1.jpg
<?php
return array(
'demo/' => 'frontend/filesGet'
);
Вроде всё работает. Я сделал себе тестовый плагин, в plugin.php прописал ему
'handlers' => array( 'routing' => 'routing' ),
Ваш роутинг разместил в lib/config/routing.php
Класс плагина у меня пустой. Код контроллера не менял.
По указанному урлу у меня нормально сохраняется файл из wa-data/public/site/1.jрg
Ищите, не застряло ли что-то в кеше браузера, в wa-cache и т.п.
У меня особенное подозрение на кеш браузера в данном случае.
Добрый день.
Создавайте не контроллер, а экшен с пустым шаблоном. В экшене достаточно просто не использовать setLayout. Заодно, можно и в шаблон что-то вывести, если, например, файл не нашелся. Ну, или у контроллера переопределите метод display, так как он по-умолчанию будет выпихивать еще системные данные в json, и файл будет выдаваться битый.
Привет, не совсем понял почему но после waFiles::readFile производится скача как и ожидается но вот колбека нет.
Как его получить? ведь например loading иконку не повесить так =( если 2 десятка файлов обрабатывать.
Все правильно, это же "скачка" а не загрузка файла на сервер. По спецификации http протокола. Открывается соединение при нажатии по ссылке, где размешен контроллер с методом readFile() и в ответ движок передает заголовки с указанием браузеру открыть диалог сохранения.
Если нужно сделать прелодер перед скачкой, то нужно это реализовать на javascript
спасибо, блин но не получается, весь извелся. что то я не понимаю видимо.
пробовал отправить js форму, не возвращается файл (на сервере она появляется*), просто форму отправляю нет ответа - хмммм
что не так?
Воспользуйтесь или разберитесь с уже готовыми реализациями. Например вот библиотека https://github.com/nehalist/do...
спасибо добрый человек =) бум глядеть.