Битрикс добавить файлы в архив и отдать на скачивание
Действие получает детальную информацию о файле. Полученная информация используется в качестве дополнительных результатов для других действий.
Параметры
Исходный объект - файл или папка на диске, информацию о которых необходимо получить;
Папка или файл Диска - можно указать дополнительные данные для действия, например ID ранее созданной папки.
Загрузить в Диск
Действие загружает файл на диск.
Параметры
Куда загрузить - возможны следующие варианты:
- Диск пользователя - в этом случае также указывается и пользователь, на диск которого будет загружаться файл;
- Диск группы соцсети - выберите, на диск какой группы загрузить файл;
- Общий диск - файл будет загружаться на общий диск;
- Папка диска - укажите папку для загрузки файла.
Файл для загрузки - выберите сам загружаемый файл;
Загружать от имени - от чьего имени будет загружен файл на диск.
Удалить объект Диска
Действие удаляет файл с диска.
Параметры
Исходный объект - файл или папка, которые нужно удалить;
Папка или файл Диска - можно указать дополнительные данные для действия, например ID ранее созданной папки;
Удалять от имени - от чьего имени будет удален файл.
Копировать/Переместить в Диске
Действие позволяет копировать элементы или перемещать их на Диске.
Параметры
Исходный объект - файл или папка, которые будут скопированы;
Папка или файл Диска - можно указать дополнительные данные для действия, например ID созданной ранее папки;
Тип операции - какая операция будет производиться: Перемещение или Копирование.
Куда - возможны следующие варианты:
- Диск пользователя - в этом случае также указывается и пользователь, на диск которого будет перемещен файл;
- Диск группы соцсети - на диск какой группы загрузить файл;
- Общий диск - файл будет загружаться на общий диск;
- Папка диска - укажите папку для загрузки файла.
Выполнять от имени - от чьего имени будет выполняться операция.
Загрузить новую версию в Диск
Загружает новую версию документа на Диск.
Параметры
Файл Диска - файл на диске, который будет обновлен;
Файл для загрузки - новая версия файла;
Загружать от имени - от чьего имени будет произведено обновление.
Создать папку в Диске
Действие создает папку в Диске.
Параметры
Где создать - где будет создана папка. Возможны следующие варианты:
Для начала создаем файл и подключаем в нем prolog_before.php и epilog_after.php, это нужно что бы нам были доступны методы API битрикс.
Выглядит это так:
<? require_once( $_SERVER [ 'DOCUMENT_ROOT' ] . '/bitrix/modules/main/include/prolog_before.php' ); //тут будет наш будущий код require_once( $_SERVER [ 'DOCUMENT_ROOT' ] . '/bitrix/modules/main/include/epilog_after.php' ); ?>
Создаем массив описывающий наш файл.
Для первого варианта (a), воспользуемся стандартным методом битрикс CFile::GetFileArray().
Обратите внимание, что в $fileInfo['ORIGINAL_NAME'] будет лежать оригинальное название файла, который вы подгружали средствами битрикс и при скачивании файла, браузер будет предлагать сохранить файл с этим именем. Поэтому при необходимости вы можете подставить свое название.
<? $fileInfo = \ CFile :: GetFileArray ( $id ); //Если нужно, то изменяем имя файла с которым браузер будет предлагать его сохранить $fileInfo [ 'ORIGINAL_NAME' ] = 'новое название файла для скачивания' ; ?>
Теперь рассмотрим второй вариант (б) и воспользуемся так же стандартным методом битрикс, только другим, CFile::MakeFileArray().
<? //Получаем абсолютный путь до файла на сервере //$filePath - это путь до файла относительно корня сайта, например '/images/image.jpg' $filePathAbs = $_SERVER [ 'DOCUMENT_ROOT' ] . $filePath ; //Формируем массив описывающий файл, где подставляем $filePathAbs, абсолютный путь до файла $fileInfo = \ CFile :: MakeFileArray ( $filePathAbs ); ?>
В результате сформируется массив аналогичный $_FILES[имя] у которого в поле $fileInfo['name'] будет лежать название файла, которое так же можно переопределить.
С формированием массивов разобрались, теперь перейдем к методу для скачивания файла. Будем так же использовать стандартный метод битрикс CFile::ViewByUser(), именно он и отвечает за отдачу тела файла на скачивание.
<? //Подключаем пролог битрикс (что бы нам стало доступно API битрикс) require_once( $_SERVER [ 'DOCUMENT_ROOT' ] . '/bitrix/modules/main/include/prolog_before.php' ); //Формируем специальный массив, описывающий файл для скачивания $fileInfo = \ CFile :: GetFileArray ( $id ); //Если нужно, то изменяем имя файла с которым браузер будет предлагать его сохранить $fileInfo [ 'ORIGINAL_NAME' ] = 'новое название файла для скачивания' ; //Отдаем файл на скачивание \ CFile :: ViewByUser ( $fileInfo , [ 'force_download' => true ] ); //Обязательно подключаем эпилог, иначе файл скачается с ошибкой require_once( $_SERVER [ 'DOCUMENT_ROOT' ] . '/bitrix/modules/main/include/epilog_after.php' ); //После закрывающего тега PHP не должно быть символов, либо его можно вообще не закрывать ?>
Хотя структура массива для второго случая в корне отличается от структуры первого, она все равно подойдет. Метод понимает оба варианта.
Полная версия отдачи файла на скачивание для второго случая (б), когда у нас на входе есть путь до файла относительно корня сайта:
Резервные копии больших проектов таких как коробочные версии порталов Битрикс24, на которых хранится большой объем информации не стоит создавать исключительно стандартными средствами системы. Как правило больше всего файлов хранится в папке битрикс upload. Обычно там находятся файлы диска, вложения к задачам, записи телефонных звонков и многое другое.
Если делать резервную копию средствами системы и включать в нее папку upload, то при распаковке копии с помощью файла битрикс restore.php можно получить неприятный сюрприз - архив с копией окажется «битым», не распакуется и вам придется приложить огромные усилия для получения файлов из архива с резервной копией.
Может получится так, что вы не сможете их получить вовсе. В этой небольшой статье я расскажу вам как нужно правильно создавать резервную копию большого проекта, когда в папке битрикс upload хранится несколько десятков гигабайт информации.
Итак, действовать мы будем следующим образом: сначала создадим архив с ядром и БД средствами Битрикса (исключим из него папку upload и некоторые другие папки), а папку upload создадим через консоль командной строки, подключившись к порталу по SSH.
Кстати создать архив с помощью системы можно 2 способами: через административную панель сайта или запустив php-скрипт резервного копирования в командной строке. Архивировать в консоли считается более надежным и профессиональным способом – так как меньше шансов, что произойдет какая-нибудь ошибка, нежели при запуске инструмента архивации через браузер. В любом случае выбирать нужно вам.
В обоих случаях резервное копирование битрикс начать стоит с настроек копирования.
Настройки для первого способа можно сделать здесь: Настройки→Инструменты→Резервное копирование→Создание резервной копии (вкладка «Параметры» ). Нужно включить экспертные настройки создания резервной копии.
До параметров резервного копирования для второго способа можно добраться следующим образом: Настройки→Инструменты→Резервное копирование→Регулярное резервное копирование (вкладка «Параметры» ).
Параметры копирования находятся на разных страницах административной панели, но опции для настройки содержат практически одинаковые.
Общие параметры резервного копирования:
- Размещение резервной копии : выбираем вариант «в папке сайта»
- Архивировать базу данных : ДА
- Исключить из базы данных : отмечаем все 3 флажка (исключать статистику, поисковый индекс, журнал событий)
- Архивировать ядро : ДА
- Архивировать публичную часть : ДА
- Исключить из архива файлы и директории по маске : указываем папки /upload, /bitrix/cache, /bitrix/backup, /bitrix/managed_cache, /bitrix/stack_cache, /upload/resize_cache, /bitrix/html_cache, /bitrix/tmp
- Шифровать данные резервной копии : НЕТ
- Проверить целостность архива после завершения : ДА
- Отключить компрессию архива (снижение нагрузки на процессор) : ДА
- Длительность шага : 20 сек., интервал: 3 сек.
- Максимальный размер несжатых данных в одной части архива (МБ) : 2047
Параметры для 2-го способа (запуск скрипта через командную строку):
- Метод запуска : наш выбор - «через прямой запуск /bitrix/modules/main/tools/backup.php»
- Удалять локальные резервные копии : выбираем вариант «никогда не удалять»
Если вы выбрали первый способ, то после установки параметров можно смело запускать создание резервной копии bitrix.
Если выбран второй способ, то нужно подключиться к серверу по SSH. Обращаю внимание, что подключаться все команды в консоли нужно под пользователем bitrix . Если вы авторизовались под пользователем root , то выполните команду
Для запуска резервного копирования выполняем следующую команду:
$ php –f /hiome/bitrix/www/ bitrix/modules/main/tools/backup.php
Независимо от того каким образом вы создавали резервную копию, на данный момент у вас есть резервная копия ядра и базы данных, которую вы сможете восстановить с помощью файла битрикс restore.php
Переходим к архивации содержимого папки upload . Если в папке хранится большое количество файлов и их объем составляет несколько гигабайт, то перед архивацией советую вам проверить свободное место на диске командной
Если места достаточно, то перейдите в папку, где хотите сохранить архив, например, /home/bitrix/www . Затем запустите команду:
$ tar -czvf upload.tar.gz ./upload
После того, как архив будет создан вы сможете скачать его на свой ПК. С архивом большого объема при загрузке могут возникнуть проблемы, поэтому лучше качать его не через FTP-клиент, а с помощью программы Download Master . Возможности этой программы позволяют загрузить файлы по FTP.
Если вдруг вам понадобится восстановить копию, созданную описанным в статье способом, то просто загрузите архив с копией ядра и БД в папку на сервере, где у вас должен размещаться портал (например, /home/bitrix/www ) вместе с файлом restore.php и запустите восстановление в браузере.
После успешного завершения установки, загрузите в ту же папку архив с битрикс upload и выполните распаковку:
$ tar -xvf upload.tar.gz
После выполнения описанных выше действий по восстановлению резервной копии, вы должны получить работоспособную копию вашего портала. Не забывайте периодически создавать резервные копии ваших проектов, особенно, перед каким-нибудь важными изменениями, такими как установка обновлений или внедрение каких-нибудь новых возможностей на ваших сайтах или порталах. Таким образом вы сможете избежать лишних проблем и сэкономить свое время, которое понадобится вам на восстановление проекта в случае его поломки.
Уже неоднократно сталкивался с задачей выведения пользователю на скачивание файлов, залитых в качестве свойств инфоблока. И если это самое свойство ставить с типом "Файл" то битрикс автоматически данному файлу присваивал уникальное имя, конфликта файлов в системе не возникало, но вот выдавать этот файл было крайне проблематично.
Старый мой пост, перенесен из моего блога на сайте 1С-Битрикс.
Уже неоднократно сталкивался с задачей выведения пользователю на скачивание файлов, залитых в качестве свойств инфоблока. И если это самое свойство ставить с типом "Файл" то битрикс автоматически данному файлу присваивал уникальное имя, конфликта файлов в системе не возникало, но вот выдавать этот файл было крайне проблематично.
До недавнего времени вместо свойства "Файл" ставил другое - "Привязка к файлу на сервере" и тогда по ИД файла вытягивалось его имя, файл выдавался на скачивание и все было просто замечательно.
Но, в один прекрасный момент, возникла задача и необходимость более профессионального подхода к данному вопросу и вот решил сделать полноценный механизм по закачке/скачке файлов.
Итак, сама задача:
Пользователь сайта через компонент добавления нового элемента ИБ добавляет свой элемент. Одним из свойств элемента является поле "Файл" с типом "Файл". Дальше этот элемент через вывод списка новостей выводим другим пользователям. Файл должен быть доступен для скачивания с тем именем, с которым его заливали, а не с той "кракозяброй", с которой он хранится на сервере.
Заливка файла проходит нормально, обычным образом, поэтому на ней останавливаться не буду.
Вывод элементов происходит с помощью стандартного компонента news.list. При выводе элементов, когда добираемся до свойства с файлом, получаем всего-лишь ИД файла и ничего больше.
Т.к. у меня таких файлов могло быть несколько, то данный блок получился такой:
Тут мы делаем перебор по всем файлам, добавленным в данное свойство элемента. Получаем файл по его ИД. Для отображения пользователю нормального, читабельного имени, получаем имя, с которым данный файл был загружен на сервер:
Дальше выводим ссылку пользователю на скачивание файла:
Скачивание файла не напрямую, а через другой вспомогательный файл со скриптом, было сделано сначала просто потому, что пользователю файл при сохранении выдавал все-таки не то имя, которое мы отображаем, а то, с которым он хранится на сервере и с этим надо было как-то бороться. Вот и пришел к решению, что нужно создать доп. файл, в котором будет определяться нужное имя файла. Этому скрипту передаем ИД файла, который нужно скачать.
Дальше дело переходит уже к скрипту.
Скрипт начинается со строки, в которой мы проверяем указан ли вообще ИД файла:
Дальше мы снова получаем оригинальное имя файла и транслитерируем его. В Данной транслитерации учтены символы русского и украинского языка. Кому нужны еще какие-то символы - добавляйте.
Для того, чтобы построить нужную нам схему html-файла, которая будет нам выдавать файл на скачивание, нужно указать соответствующие head-функции. Все данные для этих функций можно выбрать из свойств файла. Что в принципе и было сделано.
Обращаю особое внимание на строки:
Битриксовая функция получения пути файла выдает путь не физический (где файл лежит на сервере), а путь относительно корня сайта. поэтому к пути нужно добавить где сайт лежит физически на сервере.
Теперь построчно самый важный кусок всего скрипта:
Имя файла, которое будет выдано пользователю при сохранении:
Непосредственное чтение файла:
Уже после реализации, осознал несколько преимуществ такого скачивания.
Во-первых, это конечно же транслитерация названия файла. Она является достаточно важным моментом данной реализации, т.к. не все браузеры нормально реагируют на кириллицу.
Во-вторых, пользователь никак не может получить прямую ссылку на файл. И если внутри скрипта поставить доп. проверку на то, а может ли текущий пользователь скачивать этот файл, то воспользоваться прямой ссылкой без авторизации на сайте уже будет очень проблематично.
Была обнаружена критическая уязвимость в приведенном скрипте, рекомендую ознакомиться с выводами по уязвимости и принять свое собственное решение, что с этим делать. У меня, к сожалению или счастью, нет проектов, на которых есть необходимость в данном скрипте, но, возможно, кому-то будет полезно. содержит критическую уязвимость, поэтому в приведенном виде не может быть использован в конечных проектах.
Читайте также: