С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.
Задача: Прикрепить к статье файл.
Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.
Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)
Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.
Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:
Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.
Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.
Для начала нам надо настроить “файловую систему” первым делом надо создать приватную папку, где будут хранится все наши приватные файлы. Я сделал это следующим образом:
Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.
Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:
Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()
Тут кстати автор опЯчататься. На самом деле хук называется
hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей
hook_permission, а второй тот самый
hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.
После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.
Теперь идем по дополнительным пунктам:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
Уже сделано.
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.
3 и 4 пункты решает модуль
Download Count вот только портировать под 7-ку еще надо его. А вот это
Download Tools для семерки, но сам его не тестил.
Ну в общем-то тема раскрыта, комментируем.
Источник: http://www.drupal.ru/node/56888
Добавить комментарий к записи "Drupal 7 и Приватные файлы"
Чтобы комментировать, необходимо войти в систему.