Здравствуйте, подскажите пожалуйста, у меня такая вот задача стоит. Я написал модуль, который генерирует Excel файлы, кладутся они в папку на сервере, и пользователю который создал этот файл, даётся ссылка на скачивание.
<?php
return "<h3><a href='sites/default/files/excelfille/".$name_file."'"."download>Скачать файл</a></h3>";
?>
Но тут проблема в том, что любой пользователь может скачать файл из этой папки, допустим угадав имя файла. Пробовал в файловой системе, в поле "Путь к личным файлам", сделать папку private а в ней уже папку excelfille, ну и к этому же добавил такой вот hook в модуль,
<?php
function user_redir_file_download($uri) {
global $user;
if (in_array('administrator', $user -> roles) || in_array('Администратор', $user -> roles)) {
return array('Content-Type' => file_get_mimetype($uri));
} else {
return -1;
}
}
?>
но тут проблема в том, что теперь вообще никто не может скачать файл.
Подскажите пожалуйста, как можно сделать так, что бы файлы могли скачать только пользователи определенной роли, заранее благодарю за ответ.
Комментарии
Все же, правильно хранить в приватной директории, если не нужно всем доступ давать.
А организовать скачивание необходимо следующим образом:
Извините, то есть если я правильно понял, нужно сделать:
Верно ?
Ну, кроме "переходим на страницу", вроде все верно.
Тогда немного не понятно, а как калбек тогда выполниться если на страницу не переходить, вот допустим страница модуля где генерируется вот эти вот Excel файлы. Я же когда переходу на эту страницу происходит return $form в sendfca_tables_page,
<?php
function sendfca_menu() {
$items['send_fca'] = array(
'title' => t('Отправить данные в ФСА'),
'page callback' => 'drupal_get_form',
'page arguments' => array('sendfca_tables_page'),
'access callback' => 'module_access3'
);
return $items;
}
?>
А там потом после генерации и всего остального, получаю вот такую вот ссылку.
<?php
return "<h3><a href='Privates/".$name_file."'"."download>Скачать файл</a></h3>";
?>
Вы же пользователю ссылку на файл даете, при чем тут форма?
Там просто фильтр по дате, и таблица на странице
А всё, кажется я понял. Получается,
создаю страницу с аргументом -
<?php
$items['pageExcel/%'] = array(
'page callback' => 'excel_access_view',
'access callback' => TRUE,
'page arguments' => array(1),
'type' => MENU_CALLBACK,
);
?>
Ссылка на скачивание получается такая -
<?php
return "<h3><a href='pageExcel/".$name_file."'".">Скачать файл</a></h3>";
?>
Теперь в excel_access_view делаю проверку, если всё хорошо то отдаю файл если не то генерирую 403. Спасибо большое за помощь.
Да, направление верное, рад что помог.
В качестве замечания, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским. Привязка к файлу по имени выглядит не очень стабильно.
Извините но не совсем понял вот эту часть, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским
Ну я просто вот думаю, у меня же папка сейчас Privates, и эта папка у меня в "Путь к личным файлам", то есть папка закрыта, сейчас вот только проверки сделаю, что бы определенные роли скачивали из неё файлы и всё. Тут просто функционал такой что, пользователь выбирает строки из таблицы, жмет кнопку сформировать файл, и файл создается в этой папке. А потом при следующих действиях уже в другом модули, после небольшой работы, этот файл удаляется.
Ну а про привязку к имени файла понял, то есть записывать в базу данных ID файла, и в аргументе тогда уже не имя файла передавать а ID.
Все верно.
Просто, по имени файла вы не можете быть уверенным хотя бы в том, что не будет создан еще один файл и таким же названием. Да и менеджить файлы удобнее по ID'шникам.
Вот здесь неплохо описан процесс использования ядренной системы управления файлами:
Понял, спасибо
excel_access_view лучше поместить как раз в 'access callback'
В таких случаях можно генерировать путь с длинным хэшем.
Например /sites/default/files/excelfille/dhj43892v3b4rf743ghdfeb374yr34uhrf_report.xls
Ещё подсматривал сюда https://drupal.ru/node/104625 поднимался примерно такой же вопрос