Битрикс добавить файлы в архив и отдать на скачивание

Обновлено: 03.07.2024

Действие получает детальную информацию о файле. Полученная информация используется в качестве дополнительных результатов для других действий.

Параметры

Исходный объект - файл или папка на диске, информацию о которых необходимо получить;

Папка или файл Диска - можно указать дополнительные данные для действия, например 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 хранится несколько десятков гигабайт информации.

битрикс restore php ошибка при восстановление копии

Итак, действовать мы будем следующим образом: сначала создадим архив с ядром и БД средствами Битрикса (исключим из него папку 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

запуска резервного копирования через php cli

Переходим к архивации содержимого папки 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-функции. Все данные для этих функций можно выбрать из свойств файла. Что в принципе и было сделано.

Обращаю особое внимание на строки:

Битриксовая функция получения пути файла выдает путь не физический (где файл лежит на сервере), а путь относительно корня сайта. поэтому к пути нужно добавить где сайт лежит физически на сервере.

Теперь построчно самый важный кусок всего скрипта:

Имя файла, которое будет выдано пользователю при сохранении:

Непосредственное чтение файла:

Уже после реализации, осознал несколько преимуществ такого скачивания.

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

Во-вторых, пользователь никак не может получить прямую ссылку на файл. И если внутри скрипта поставить доп. проверку на то, а может ли текущий пользователь скачивать этот файл, то воспользоваться прямой ссылкой без авторизации на сайте уже будет очень проблематично.

Была обнаружена критическая уязвимость в приведенном скрипте, рекомендую ознакомиться с выводами по уязвимости и принять свое собственное решение, что с этим делать. У меня, к сожалению или счастью, нет проектов, на которых есть необходимость в данном скрипте, но, возможно, кому-то будет полезно. содержит критическую уязвимость, поэтому в приведенном виде не может быть использован в конечных проектах.

Читайте также: