[FileAttach] Загрузка файлов на сайт во frontend
Начиная с версии 1.0.6 дополнения FileAttach появилась возможность использовать функционал дополнения на лицевой части сайта. На самом деле, с некоторыми оговорками, компонент и ранее можно было приспособить, но теперь добавилось несколько приспособлений.
Для демонстрации возможностей вы можете ознакомиться из примера, скачав по ссылке. Распакуйте архив на сайте, задайте права группе пользователя и авторизуйтесь на сайте.
Обращение к функциях дополнения производится через соединитель (connector), которому в аргументах задается параметр, указывающий на нужную функцию (processor). Результат работы возвращается в формате JSON, потому для удобства обработки результатов вам потребуется реализовать обвязку на Javascript.
Предполагается, что во frontend пользователь будет в основном выполнять выгрузку файлов на сервер, при этом для управления используя три функции:
Пример вызова получения списка присоединенных файлов:
Через метод GET обращаемся по адресу: mysite.ru/assets/components/fileattach/connector.php?action=web/getlist&ctx=web&docid=100
Здесь параметры означают:
Выполняется запросом методом POST к процессору mgr/upload с типом кодирования формы multipart/form-data. Параметрами надо указать ctx, docid, file.
Процессор ответит в формате JSON, сообщив о результате и списке принятых файлов:
{«success»:true,«total»:«1»,«results»:[{«id»:37,«fid»:«pPSVL79cTgCSkU5yoArcPBkNPfbsCLq1»,«name»:«price.xls»}]}
Необходимый набор разрешений:
Во-первых нужно предоставить доступ для медиа-источника с разрешением на «create». Затем надо включить разрешение на «file_upload» из шаблона AdminTemplate. Соответствующие политики назначьте группе пользователя для контекста web или того, который используется на лицевой части сайта.
Скачивание файлов
Выполняется запросом к процессору web/download. Параметрами надо указать ctx, fid (строковой идентификатор записи файла).
Необходимый набор разрешений:
Для скачивания надо разрешить «fileattach.download».
Есть две политики, которыми можно разрешить скачивание, первая это «File Attach Download» предназначенная только для скачивания, и «File Attach Frontend» для разрешения работы во frontend.
Назначьте одну из них для группы пользователя в контексте web.
Список файлов
Выполняется запросом к процессору web/getlist. Параметрами надо указать ctx, docid.
Процессор ответит в формате JSON, сообщив о результате и списке файлов:
{«success»:true,«total»:«1»,«results»:[{«id»:38,«name»:«servicing.xlsx»,«fid»:«pPSVL79cTgCSkU5yoArcPBkNPfbsCLq1»,«hash»:«a24c27a4edd12c9809a7f948c0322d8aa14f68c8»}]}
Удаление файлов
Выполняется запросом к процессору web/remove. Параметрами надо указать ctx, docid, список идентификаторов файлов ids в формате JSON.
Необходимый набор разрешений:
Для доступа к удалению надо разрешить «fileattach.remove».
При этом допускается удаление своих файлов, соответствующих указанному ресурсу. Чтобы позволить удалять не только свои файлы надо включить так же и «fileattach.totallist».
Для демонстрации возможностей вы можете ознакомиться из примера, скачав по ссылке. Распакуйте архив на сайте, задайте права группе пользователя и авторизуйтесь на сайте.
Обращение к функциях дополнения производится через соединитель (connector), которому в аргументах задается параметр, указывающий на нужную функцию (processor). Результат работы возвращается в формате JSON, потому для удобства обработки результатов вам потребуется реализовать обвязку на Javascript.
Предполагается, что во frontend пользователь будет в основном выполнять выгрузку файлов на сервер, при этом для управления используя три функции:
- выгрузка файлов на сервер
- скачивание файлов с сервера
- получение списка присоединенных файлов к заданному ресурсу
- удаление присоединенных файлов у заданного ресурса
Пример вызова получения списка присоединенных файлов:
Через метод GET обращаемся по адресу: mysite.ru/assets/components/fileattach/connector.php?action=web/getlist&ctx=web&docid=100
Здесь параметры означают:
- action = вызов процессора web/getlist
- ctx = выполнение в контексте web
- docid = у ресурса с идентификатором 100
Выполняется запросом методом POST к процессору mgr/upload с типом кодирования формы multipart/form-data. Параметрами надо указать ctx, docid, file.
Процессор ответит в формате JSON, сообщив о результате и списке принятых файлов:
{«success»:true,«total»:«1»,«results»:[{«id»:37,«fid»:«pPSVL79cTgCSkU5yoArcPBkNPfbsCLq1»,«name»:«price.xls»}]}
Необходимый набор разрешений:
Во-первых нужно предоставить доступ для медиа-источника с разрешением на «create». Затем надо включить разрешение на «file_upload» из шаблона AdminTemplate. Соответствующие политики назначьте группе пользователя для контекста web или того, который используется на лицевой части сайта.
Скачивание файлов
Выполняется запросом к процессору web/download. Параметрами надо указать ctx, fid (строковой идентификатор записи файла).
Необходимый набор разрешений:
Для скачивания надо разрешить «fileattach.download».
Есть две политики, которыми можно разрешить скачивание, первая это «File Attach Download» предназначенная только для скачивания, и «File Attach Frontend» для разрешения работы во frontend.
Назначьте одну из них для группы пользователя в контексте web.
Список файлов
Выполняется запросом к процессору web/getlist. Параметрами надо указать ctx, docid.
Процессор ответит в формате JSON, сообщив о результате и списке файлов:
{«success»:true,«total»:«1»,«results»:[{«id»:38,«name»:«servicing.xlsx»,«fid»:«pPSVL79cTgCSkU5yoArcPBkNPfbsCLq1»,«hash»:«a24c27a4edd12c9809a7f948c0322d8aa14f68c8»}]}
Удаление файлов
Выполняется запросом к процессору web/remove. Параметрами надо указать ctx, docid, список идентификаторов файлов ids в формате JSON.
Необходимый набор разрешений:
Для доступа к удалению надо разрешить «fileattach.remove».
При этом допускается удаление своих файлов, соответствующих указанному ресурсу. Чтобы позволить удалять не только свои файлы надо включить так же и «fileattach.totallist».
Комментарии: 115
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Был момент с получением доступа ко всем файлам (даже закрытым) перебором id. Это по прежнему возможно? Вместо id можно как-то проставить hash? Пока пользуюсь забугорским загрузчиком, он значительно проигрывает в удобстве предоставления информации, но при этом в ссылке нет id — превращает хэширует имя файла и директорию. Плюс есть разграничение доступа по группам, не, чтобы часто используется, но иногда полезно. Очень надеюсь, что подобное появится в FileAttach, поскольку с точки зрения менеджера сайта он на порядок приятнее и комфортнее в использовании.
В обновленной версии 1.0.7 больше нет возможности скачивания файлов через перебор цифрового идентификатора, отныне обращение производится через уникальный строковой идентификатор.
Так же появилась возможность регулирования отображения списка ссылок в сниппете через группы.
П.С. Хорошо, что автор развивает компонент.
Удивительное дело, не устанавливается пакет. MODX Revolution 2.4.3-pl Сайт на ModHost.Pro, устанавливаю из репозитария modstore.pro С иными пакетами проблем нет.
Использую fileAttach во фронте (Ajax-загрузка), чтобы добавлять файлы к форме обратной связи, в коде через хук
цепляю файлы. НО!
Чтобы прицепить файлы к письму с нормальными именами (а не X465VMijhrre97nvxwedfhdfdg.doc), я для каждого делаю переименование (item — отдельный объект FileItem) обратно в оригиниальное название:
и отправляю. Письмо приходит удачно с нормальными именами файлов (допустим «Документ 1.doc»).
Но затем в хуке после отправки мне необходимо удалить этот переименованный файл, но
Не проходит, т.к. он ищет X465VMijhrre97nvxwedfhdfdg.doc, а не переименованный «Документ 1.doc».
Поэтому объект удаляется, а файл — нет. Как быть? Почему при rename internal_name в таблице не изменился на Документ 1.doc (смотрю через phpMyAdmin).
Мне нужно чтобы аноним мог файлы загружать. Как это можно настроить?
Это верные настройки источника (на скрине)? Потому что так файлы через админку загрузить не получается (Interal Server Error). Если поставить «Файловая система», то работает.
Извини конечно, что столько пишу, просто сроки подходят, а у меня заминки с правами, я это откладывал откладывал и вот уже и финиш и кипишь
в core/components/fileattach/processors/mgr/upload.class.php
обязательно обозначаем переменную в виде ссылки!
тут же идет присвоение:
хм вопрос интересный в связи с использованием плагинаов, но можно оставить и так. По присвоению я бы использовал fromArray один раз через, чем много set, будет красивее.
и в сниппете snippet.fileattach.php обязательно меняем присвоение url на ибо именно internal_name будет содержать настоящий путь к файлу.
Ну и while(1)… я бы не стал использовать, как то мне не нравиться это.
И еще, ты используешь стандартный getChunk, хотя можно использовать его из pdoTools, тогда префиксы @FILE, @INLINE итд будут работать, что есть плюс для любителей статики.
Ситуацию с set да, можно переделать. Повысит требование к версии PHP.
Для открытых файлов internal_name должен быть идентичен name.
While(1) в том случае не страшен, тело выполняется как правило не более 1-2 раз.
pdoTools можно бы использовать, но на практике сомнительна выгода в производительности.
1) Поле «Имя». Зачем нужна возможность его смены, если это не ведёт к переименованию файла на сервере? Менеджеры меняют его, в итоге ссылка становится нерабочей. По-моему было бы логичнее его сделать disabled, как хэш. А поле «Описание» использовать для текста ссылки во фронте, я обычно так делаю…
2) Выше уже писали про плагин. Я использую TransliterateFileNames для транслитерации русских имен файлов, в итоге при загрузке в FileAttach битая ссылка. Может придумать какую-нибудь встроенную опцию про транслит?
Если не смогу придумать выхода, буду искать или замену компоненту… хотя таких удобных аналогов не видела или приучать менеджеров не закачивать файлы с русс.именами.
Пока пользуюсь так.
Теперь у нас есть еще одна опция &showDate=`1` и еще один плейсхолдер [[+filedate]], что содержит дату файла.
Виталий, внесете дополнения в сниппет FileAttach?
Новая опция: showTime
Новый placeholder: timestamp
github.com/13hakta/FileAttach
BTW. Мой клиент чуть расширил задачу и мне понадобилось передать [[+url]] дальше. Пришлось урл закодировать. Так появились еще две строчки:
Насколько оно надо другим, не скажу. Но если надо — пользуйтесь.
В шаблоне как-то так:
[[FileAttach:default=`нет никто`?
&tpl=`custom.FileAttachTpl`
&showSize=`true`
&privateUrl=`1`]]
Работает на сайте на ура.
?
Я например переносил когда таблицу хранения файлов от одного из компонентов MODX Evo не смог придумать применения столбцу с размерами файлов. А так компонент отличный!
а в чанке указать [[+size]]
По поводу вывода размера, я бы добавил возможность вывода в мегабайтах.
Можно конечно как -то так делать:, но много чисел после запятой, как обрезать модификатором не знаю))
Могу попробовать сам этот функционал дописать, если вам особо некогда. Если у меня получится, то куда если что прислать дополнение к коду? Чтобы оно выло в компоненте в виде обновления
"Скачать файл"
или просто вот так — "[[FileAttach? &privateUrl=`4`]]"
архив с файлом загружен, присвоился ид 4, вроде так и указано но качается страничка html вместо файла.
Мне кажется каждому разработчику стоило бы задуматься над тем как он преподносит свое дополнение. Мало того что документация написана себе на уме так еще и скрины неактивны. Вроде как следовало бы быть благодарным за то что люди это все разрабатывают, но пока что от этих дополнений получается больше гемора чем реальной пользы.
И такие большинство документаций. Неуж-то нельзя прикрепить к документации пару скринов того как оно выглядит на практике? Не, ну если вы написали это дополнение для себя и вам без разницы сможет ли еще кто-то им пользоваться — тогда конечно вас можно понять
makeURL true/false — в чем разница?
Не заметил разницы.
true/false — ссылка не меняется.
Спасибо
Как загружать файлы, просто в общую папку, не к конкретному ресурсу?
Спасибо
2) заменить вызов чанка
на
Это в самом сниппете, продублируй и заменяй
Вывожу файлы через «Приватный режим/ fileattach.private ». Но почему-то файлы качаются пустые — вес файла 0 кб.
Запускаю snippet
В системных настройках все — НЕТ. Кроме
fileattach.private — 1
fileattach.mediasource — 1
fileattach.files_path — assets/audio/
fileattach.templates — 3
Также включен траслит файлов, хотя я его не включал (при загрузке меняется имя файла)
Путь не менялся.
Напрямую файл качается (без fileattach.private)
Почему-то регистр имени не соответствует. Файл полностью с нижним регистром, а в запросе он разный.
При этом в логах никаких ошибок нет.
Подскажите, пожалуйста, в чем может быть причина? Куда копать?
P.S. Реализация загрузки файлов с фронтэнда сделана с помощью примера от автора)
Есть ли возможность указывать количество скачиваний файла?
Например есть фотобанк:
1. Пользователь 1 — может скачать 5 раз.
2. Пользователь 2 — может скачать 15 раз.
Может ли ваш плагин считать кол-во скачиваний, и потом запрещать доступ после лимита?
В дополнении msFile, которое работает на базе FileAttach с miniShop2 возможно отслеживание был ли скачан файл покупателем и возможно выставлении времени действия ссылки.
Есть ли возможность делать одноразовые ссылки?
Чтобы при этом не пришлось дублировать документы, если для разных языков они остаются те же самые…