Как скачивать файлы в Catalyst-приложении

Как организовать скачивание файлов в Catalyst-приложении. Работа с форматами csv, tsv, txt, xml в Catalyst. Использование модуля Catalyst::View::Download . Добавление собственных форматов файлов.

Достаточно часто встречаются ситуации, когда необходимо позволить пользователю скачать файл с сайта. Например, прайс-листы в xls-формате, шаблоны договоров, отчеты о продажах в csv, бланки квитанций для платежей и т.п.

Catalyst::View::Download - создает view, который позволяет скачивать данные в различных форматах. Поддерживается работа с форматами: txt, csv, xml и html.

1. Устанавливаем модуль Catalyst::View::Download

2. Создаем новое view

3. Используем новое view для скачивания данных в txt, xml, html и csv форматах.

Файл в csv-формате Catalyst::View::Download генерирует сам, достаточно передать ему подготовленный массив с данными.

lib/app/Controller/Admin/PaymentReports.pm :

4. Запускаем сервер

Вводим в браузере http://localhost:3000/admin/payment_reports_csv .

Нам будет предложено сохранить paymentreport.csv файл , или сразу открыть его с помощью какой-нибудь программы.

Для получения файлов с данными в других форматах, надо использовать адреса:

  • http://localhost:3000/admin/get_price_xml - файл с именем price.xml
  • http://localhost:3000/admin/get_blank_html - файл с именем paymentblank.html
  • http://localhost:3000/admin/get_blank_txt - файл с именем paymentblank.txt

 

Добавление собственных форматов файлов

Допустим, мы хотим использовать Catalyst::View::Download для того, чтобы пользователи могли скачивать файлы в форматах, отличных от предлагаемых.
Например, часто требуется отдавать данные в pdf или doc форматах.

Добавить поддержку новых форматов в Catalyst::View::Download можно самостоятельно. Для этого достаточно немного изучить исходный код модулей Catalyst::View::Download и Catalyst::View::Download::Plain.

Для того, чтобы позволить клиенту скачивать файлы в формате doc, создаем модуль
app::View::Download::Doc. Содержимое можно просто скопировать из модуля Catalyst::View::Download::Plain, а вставки plain заменить на doc. "Content-Type" указать соответствующий для doc-файлов (можно посмотреть в таблицах mime-типов).

Созданный модуль позволит скачивать файлы doc-файлы. Doc-файл может быть создан заранее с помощью OpenOffice (и т.п.), либо генерироваться отдельными методами catalyst-приложения.

lib/app/View/Download/Doc.pm :

После того, как создан модуль app::View::Download::Doc, прописываем его в конфиге модуля Catalyst::View::Download .

lib/app/View/Download.pm :

После этого создаем модуль, или просто подпрограмму, которая будет обрабатывать запрос от пользователя, на скачивание doc-файла. При необходимости, можно генерить файл самостоятельно, в рамках catalyst-приложения, но в данном примере, мы просто берем готовый doc-файл, считываем его и передаем клиенту.

lib/app/Controller/Admin/Partner.pm :

После того, как пользователь введет в браузере http://localhost:3000/admin/partner/get_oferta, ему будет предложено сохранить файл под именем oferta_for_partners.doc .

 

Полезные ссылки

search.cpan.org: Catalyst::View::Download

search.cpan.org: Catalyst::View::Download::Plain

ru.wikipedia.org: Список MIME-типов

Как скачивать файлы в Catalyst-приложении: 2 комментария

  1. Andrey

    А что произойдет с этой поделкой, если качать будет медленный клиент? Например, качать по 1-му байту в 10 секунд.
    Предвижу, что процесс каталиста будет отрабатывать только этого клиента. А сколько у вас в проекте процессов каталиста - штук 10-15. Получается пишем медленных клиентов штук 10-15 и вешаем ваш сайт задешево. Как-то так

    1. Natalie Автор записи

      Андрей, я не рассматривала уровень быстродействия данного решения. Возможно потому, что в тех условиях, где его использовала я - это не было необходимо. А конкретнее: административные интерфейсы, крайне редкая потребность (2-4 раза в месяц) скачать файлы с отчетами.
      Для подобных задач - заниматься оптимизацией, быстродействием, профайлингом - просто не актуально. Если бы речь шла о файловом хранилище - это было бы совершенно другое дело.
      Я думаю, человек, который захочет что-то реализовать, в любом случае будет САМ анализировать свои потребности и принимать решение - как именно он будет решать задачу. Я же просто делюсь опытом.

Комментарии запрещены.