Вывести размер файла bitrix
Обновлено: 06.07.2024
Загрузка файла на сайт - это довольно рядовой процесс. Но как загрузить пользовательский файл в свойство элемента инфоблока bitrix через форму?
В официальной документации сказано, что для загрузки файла надо передать свойству описывающий его массив:
"DETAIL_PICTURE" => CFile::MakeFileArray( $_SERVER["DOCUMENT_ROOT"] . "/image.jpg" )
Функция CFile::MakeFileArray служит для создания такого описания. Но если загружать файл через форму с input type="file", то он попадает далеко не в самое приятное место, в папку /tmp/. А если сохранять файл из /tmp/ через MakeFileArray, то появится проблема с его именем и расширением. Потому что загруженный файл имеет автоматически сгенерированное имя в виде случайного набора символов.
Но если вчитаться в документацию, то можно заметить следующее:
MakeFileArray формирует массив описывающий файл. Структура массива аналогична структуре массива $_FILES[имя]
Поэтому нет никакой необходимости вообще применять эту функцию. Можно сразу же передавать свойству "файл" значение $_FILES['FILE']. Тогда код создания элемента с файлом будет выглядеть так
$el = new CIBlockElement;
$arProp = Array("IBLOCK_ID" => 'ID',
"NAME" => 'NAME',
"PROPERTY_VALUES" => array("FILE" => $_FILES['FILE']
)
);
$element_id = $el->Add($arProp);
Не стоит забывать про валидацию данных: необходимо проверять размер и расширение файла перед загрузкой. Заодно не забудьте установить в свойствах инфоблока, у поля FILE, допустимые расширения файлов:
P.S.
Описание как сделать интерактивную проверку размера и расширения файла через js/jq скрипт можно найти в статье "Размер и тип файла в input file".
В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1С-Битрикс. С показом оригинального названия файла, его транслитированной версии, размера файла в килобайтах и, само собой, ссылкой на скачивание.
Исходные данные для вывода файлов
Итак, в инфоблоке каталога сайта имеем стандартное, множественное свойство "типа файл" с кодом "FILES".
Если мы его выведем, штатным способом, через вывод свойств- как оно задумано в Битрикс изначально. Выглядеть это будет не казисто и не интересно
Абсолютно не интересно и самое главное не информативно. В моем случае, в данное свойство загружаются документы. Причем они в разных форматах и разного размера. Пользователь должен видеть и название документа и его размер с форматом. Например вот так:
Выводим свойство файл через API Битрикс- получая все данные о файлах
Все достаточно просто, так как множественные свойства это обычные массивы. Мы можем получить все данные о каждом файле, просто зная код свойства, в моем случае "FILES". Выглядеть foreach будет следующим образом.
Расскоментировав строку
// echo '<pre>';print_r($arProperty);echo '</pre>';
Вы сможете увидеть все данные о каждом файле, доступные для вывода. По мимо основных, там есть и дата загрузки и тип файла.
В принципе и все. Конкретно в моем случае, в примере выше, результат вывода выглядет следующим образом:
Несколько полезных моментов
Байты в килобаты (размер файла), я привратил, обычной php функцией округления в большую сторону round. Предварительно приведя байты в килобаты. просто разделив $arProperty['FILE_SIZE'] на 1024 (смотри в коде выше).
Иконки для разных типов файлов, назначил через CSS - тут простая стилизация. Зная расширение файла, а точнее расширенеие на которое заканчивается ссылка, просто прописал background для каждой разновидности ссылки. Вот так:
Как красиво вывести множественное свойство типа файл в инфоблоке 1С-Битрикс. С показом оригинального названия файла, его транслитированной версии, размера файла в килобайтах и, само собой, ссылкой на скачивание.
Исходные данные для вывода файлов
Итак, в инфоблоке каталога сайта имеем стандартное, множественное свойство "типа файл" с кодом "FILES".
Если мы его выведем, штатным способом, через вывод свойств- как оно задумано в Битрикс изначально. Выглядеть это будет не казисто и не интересно
Абсолютно не интересно и самое главное не информативно. В моем случае, в данное свойство загружаются документы. Причем они в разных форматах и разного размера. Пользователь должен видеть и название документа и его размер с форматом. Например вот так:
Выводим свойство файл через API Битрикс- получая все данные о файлах
Все достаточно просто, так как множественные свойства это обычные массивы. Мы можем получить все данные о каждом файле, просто зная код свойства, в моем случае "FILES". Выглядеть foreach будет следующим образом.
Расскоментировав строку
// echo '<pre>';print_r($arProperty);echo '</pre>';
Вы сможете увидеть все данные о каждом файле, доступные для вывода. По мимо основных, там есть и дата загрузки и тип файла.
В принципе и все. Конкретно в моем случае, в примере выше, результат вывода выглядет следующим образом:
Несколько полезных моментов
Байты в килобаты (размер файла), я привратил, обычной php функцией округления в большую сторону round. Предварительно приведя байты в килобаты. просто разделив $arProperty['FILE_SIZE'] на 1024 (смотри в коде выше).
Иконки для разных типов файлов, назначил через CSS - тут простая стилизация. Зная расширение файла, а точнее расширенеие на которое заканчивается ссылка, просто прописал background для каждой разновидности ссылки. Вот так:
В этой статье собраны ответы на самые часто задаваемые вопросы о диске.
Что может Битрикс24.Диск?
Вы можете организовать коллективный доступ и работу над документами с помощью Общего диска.
Для хранения персональных файлов каждый сотрудник может использовать личное хранилище - Мой диск.
Битрикс24.Диск позволяет синхронизировать ваши файлы и папки в облаке с жестким диском и работать с ними в любое удобное время.
Чтобы работать с файлами вашего Битрикс24.Диска на компьютере, вы можете подключить вcё хранилище или отдельную папку как сетевой диск. Файлы будут синхронизированы, и при работе на компьютере все изменения появятся на вашем Битрикс24. И наоборот.
Подробнее о подключении своего диска читайте в статье.
Можно ли отследить полную историю изменений файлов на Диске?
Можете отследить историю изменений каждого файла в отдельности. Общая история изменений на Диске на данный момент не реализована.
Как очистить место на диске?
В разделе Мой тариф > Место в облаке указано сколько и чем занято места.
Можно ли подключить облачное хранилище к Битрикс24?
Возможность подключения облачного хранилища к Битрикс24 не предусмотрена. Вы можете загрузить файлы в Битрикс24 с облачного хранилища.
Есть ли возможность перенести документы с Моего диска на Общий диск компании?
Перемещение документов возможно только в рамках одного диска: общего или личного.
Можно ли загрузить сразу несколько папок на диск?
На данный момент такая возможность не реализована. Вы можете создать папку на диске, перейти в неё и загрузить файлы.
Можно ли синхронизировать Диск Битрикс24 с данными на диске компьютера?
Да, это можно сделать с помощью Десктоп-приложения.
Подробную инструкцию читайте в статье.
Можно ли синхронизировать диск с рабочего ПК и домашнего?
Да, конечно. Если несколько десктопов под одним логином на разных устройствах, то они между собой будут синхронизировать файлы.
Как сделать, чтобы сотрудники не могли скачивать файлы с диска?
Вы не можете запретить скачивать файлы, если к ним есть право доступа. Даже при минимальном праве на чтение будет возможность скачать файл.
Важно! Свойства инфоблока файл не отображаются в Параметрах компонента (настройки с иконкой шестеренка). Поэтому их вызов только через PROPERTIES, а не DISPLAY_PROPERTIES.
Если в настройках компонента не стоит NAME то массив с изображениями не выведется
Ресайз изображений налету
- BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize без сохранения пропорций;
- BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize;
- BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшенная обработка вертикальных картинок.
Если нужно чтобы ресайз был с сохранением пропорций для горизонтальных фото, то ширину и высоту лучше выставлять одинакового размера
<?
$file = CFile::ResizeImageGet(($arResult["DETAIL_PICTURE"]), array('width'=>800, 'height'=>800), BX_RESIZE_IMAGE_PROPORTIONAL, true);
echo '<img src="https://gvozdevsoft.ru/info/tekhrazdel/bitriks/'.$file['src'].'" width="'.$file['width'].'" height="'.$file['height'].'" alt="'.$arResult["NAME"].'" title="'.$arResult["NAME"].'" />';
?>
Ресайз изображений для Каталога (catalog.section)
<?
$file = CFile::ResizeImageGet(($item["PREVIEW_PICTURE"]["ID"]), array('width'=>800, 'height'=>800), BX_RESIZE_IMAGE_PROPORTIONAL, true);
echo '<img src="https://gvozdevsoft.ru/info/tekhrazdel/bitriks/'.$file['src'].'" width="'.$file['width'].'" height="'.$file['height'].'" alt="'.$item["NAME"].'" title="'.$item["NAME"].'" />';
?>
Конструкция для вывода картинки анонса с проверками и ресайзом
<?if($arParams["DISPLAY_PICTURE"]!="N" && $arItem["PREVIEW_PICTURE"]):?><div >
<a href="<?echo $arItem["DETAIL_PAGE_URL"]?>">
<?
$file = CFile::ResizeImageGet(($arItem["PREVIEW_PICTURE"] ? $arItem["PREVIEW_PICTURE"] : $arItem["DETAIL_PICTURE"]), array('width'=>700, 'height'=>700), BX_RESIZE_IMAGE_PROPORTIONAL, true);
echo '<img src="https://gvozdevsoft.ru/info/tekhrazdel/bitriks/'.$file['src'].'" width="'.$file['width'].'" height="'.$file['height'].'" alt="'.$arItem["NAME"].'" />';
?>
</a>
</div>
<?endif;?>
Условие, если поле заполненное вывести его значение (один элемент)
<? if($arItem["DISPLAY_PROPERTIES"]["ATT_TEXT"]["VALUE"]):?>
<?=$arItem["DISPLAY_PROPERTIES"]["ATT_TEXT"]["VALUE"];?>
<?endif;?>
<? if($arResult["DISPLAY_PROPERTIES"]["ATT_TEXT"]["VALUE"]):?>
<?=$arResult["DISPLAY_PROPERTIES"]["ATT_TEXT"]["VALUE"];?>
<?endif;?>
Важно!
Отличие PROPERTIES от DISPLAY_PROPERTIES
Если узазать DISPLAY_PROPERTIES то будут выведены свойства инфоблока, которые выбраны в настройках параметра Компонента.
Если какое либо свойство не отображается в параметрах компонента (например свойство файл), то указывается через PROPERTIES.
Если свойство определяется в параметрах компонента, то можно к нему обратиться как через DISPLAY_PROPERTIES так и через PROPERTIES
Конструкция if
Так работают все проверки. Проверяется если поле не пустое, то массив arItem отдает true следовательно условие выполняется
<? if($arItem["DISPLAY_PROPERTIES"]["ATT_LINK"]["VALUE"]):?>
Действие
<?else:?>
Действие
<?endif;?>
Ссылки
<a href="<?=$arItem["DETAIL_PAGE_URL"]?>"> - ссылка на детальную страницу
<a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><?=$arItem["NAME"]?></a> - вывод ссылки на детальную страницу. Анкор ссылки взят из поля "Название"
Когда какой массив используется $arResult и $arItem
$arResult основной массив в который может входить множество массивов $arItem
Если вы работаете с news.list либо news-news.list то сначала создается массив $arResult в котором создаются $arItem. И обращение в этих шаблонах (template.php) будет только к $arItem
Задается он следующим образом
<?foreach($arResult["ITEMS"] as $arItem):?>
Внутри этого массива обращение только к $arItem
<?endforeach;?>
Читайте также: