- SaveFile
- Описание и параметры
- Параметры
- Возвращаемое значение
- Смотрите также
- Примеры использования
- Пользовательские комментарии
- Deen812
- линия
- четверг, 16 ноября 2017 г.
- Bitrix: ajax загрузка фото или облегчаем себе жизнь
- Ближе к делу
- Класс CFile
- Описание и поля
- Список методов
- Пользовательские комментарии
- Отдельная директория для файлов инфоблока
- Массовое добавление картинок с другого сайта
SaveFile
Описание и параметры
Метод сохраняет файл и регистрирует его в таблице файлов (b_file). Статический метод.
Параметры
Параметр | Описание | С версии |
---|---|---|
file | Массив с данными файла формата: |
Массив такого вида может быть получен, например, объединением массивов $_FILES[имя поля] и Array(«del» => $<"имя поля"."_del">, «MODULE_ID» = «название модуля»);
Возвращаемое значение
Метод возвращает числовой идентификатор сохранённого и зарегистрированного в системе файла.
Смотрите также
Примеры использования
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Источник
Deen812
ТВОРИТЬ — ВОТ НАСЛАЖДЕНИЕ!
линия
четверг, 16 ноября 2017 г.
Bitrix: ajax загрузка фото или облегчаем себе жизнь
Недавно случился казус. Поступила задача, прикрутить к форме отправки сообщений возможность прикрепить файлы. И чтобы был прогрессбар и смотрелось сие дело чинно и красиво. Да, задача решаема, особых сложностей не вызывает. В молодости, я имел вредную привычку, решать задачи в лоб. Но теперь то я не такой и зеленый. Практически на стадии зрелости. Первым делом отошел от компьютера и посмотрел в окно. На улице шел снег. Наконец то грязная последняя стадия осени сдалась и все стало бело. Всматриваясь в даль вдруг меня осенило — по любому в битриксе есть встроенный компонент для загрузки файлов. И я сильно удивился, когда такой имелся. Обрадовался я кончено дико. Визжал от радости как подросток.
Ближе к делу
Итак, что имеем:
Обычная форма. При клике на отправить обрабатывается JQUERY и предает данные в /inlude/ajax/form.php. Разумеется все работает AJAX-ом.
Теперь добавляем в шаблон формы компонент:
Ищем компонент в /bitrix/components/main.file.input/ копируем шаблон в шаблон сайта. переименуем шаблон в drag_n_drop — на случай если будем менять стили.
Открываем форму и видим такую красоту:
Кстати, можно сделать мульти загрузку, задать маску входных файлов.
Компонент загружает файл в /upload/main/ и после загрузки возвращает id файла.
Источник
Класс CFile
Описание и поля
Класс для работы с файлами и изображениями.
Аналог класса в новом ядре D7 — Bitrix\Main\FileTable.
Поле | Тип | Описание |
---|---|---|
ID | int | ID файла. |
TIMESTAMP_X | timestamp | Дата изменения записи. |
MODULE_ID | varchar(50) | Идентификатор модуля которому принадлежит файл. |
HEIGHT | int | Высота изображения (если файл — графический). |
WIDTH | int | Ширина изображения (если файл — графический). |
FILE_SIZE | int | Размер файла (байт). |
CONTENT_TYPE | varchar(255) | MIME тип файла. |
SUBDIR | varchar(255) | Подкаталог в котором находится файл на диске. Основной каталог для хранения файлов задается в параметре «Папка по умолчанию для загрузки файлов» в настройках главного модуля, значение данного параметра программно можно получить с помощью вызова метода: |
FILE_NAME | varchar(255) | Имя файла на диске сервера. |
ORIGINAL_NAME | varchar(255) | Оригинальное имя файла в момент загрузки его на сервер. |
DESCRIPTION | varchar(255) | Описание файла. |
Список методов
Метод | Описание | с версии |
---|---|---|
GetByID | Возвращает информацию по одному зарегистрированному файлу. | 3.1.6 |
GetList | Возвращает отсортированную и отфильтрованную выборку зарегистрированных файлов. | 7.0.2 |
GetPath | Метод возвращает путь от корня сайта к зарегистрированному файлу. | 3.3.21 |
ShowImage | Возвращает HTML для показа изображения. | |
Show2Images | Возвращает HTML для показа изображения при клике на которое в отдельном окне отображается другое изображение. | 3.2.1 |
CheckFile | Проверяет размер, расширение и mime тип файла. В случае ошибки метод вернет строку с текстом ошибки. | |
CheckImageFile | Проверяет что файл является картинкой и проверяет ее параметры. В случае ошибки метод вернет строку с текстом ошибки. | |
IsImage | Метод проверяет расширение и заданный MIME тип файла. Если расширение и MIME тип файла соответствуют изображению, то возвращает «true», иначе «false». | 3.3.18 |
MakeFileArray | Метод формирует массив описывающий файл. Структура массива аналогична структуре массива $_FILES[имя] (или $HTTP_POST_FILES[имя]). Данный массив может быть использован в методах CFile::SaveFile, CFile::CheckFile, CFile::CheckImageFile. | 3.2.9 |
InputFile | Возвращает HTML код предназначенный для загрузки нового, либо замены существующего файла. | |
SaveFile | Сохраняет файл и регистрирует его в таблице файлов. | |
SaveForDB | Сохраняет файл и подготавливает данные для вставки/обновления записи в БД, содержащей ссылку на файл | 7.1.0 |
UpdateDesc | Обновляет описание к зарегистрированному файлу. | 3.3.21 |
CopyFile | Копирует зарегистрированный файл. | 3.0.14 |
Delete | Удаляет файл из таблицы зарегистрированных файлов и с диска. | |
FormatSize | Метод переводит байты в единицы с учетом языка, установленного в текущем сайта.. | 8.6.4 |
GetFileArray | Возвращает массив описывающий файл с заданным идентификатором. | 5.1.8 |
ResizeImageFile | Метод производит изменение размера графического файла | 7.1.1 |
ResizeImageGet | Метод уменьшает картинку. | 7.1.1 |
ResizeImage | Обертка ResizeImageFile | 7.1.1 |
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Источник
Отдельная директория для файлов инфоблока
По умолчанию для всех файлов инфоблоков используется общая папка /upload/iblock/. Файлы сохраняются в подпапки, сгенерированные случайным образом, например, /upload/iblock/ff7/.
Как следствие, все файлы доступны по прямой ссылке. В целом, в этом нет ничего страшного, так как итоговый путь (при условии, что файл отдается через php) сложно подобрать. Но в некоторых случаях требуются дополнительные меры безопасности.
Основная идея – как-то вынести файлы инфоблока в отдельную подпапку и закрыть её с помощью стандартных механизмов nginx / apache.
Небольшим дополнительным плюсом будет то, что можно достаточно просто посмотреть, сколько места занимают файлы отдельного инфоблока.
Суть в следующем: в методе CFile::SaveFile второй параметр ($strSavePath) отвечает за директорию внутри папки upload. Инфоблоки его передают как «iblock», нам надо его заменить.
- Код, приведенный ниже не рекомендуется к использованию, но в целом он позволяет решить задачу (и, в том числе, работает, как в публичной, так и в административной части).
- Случай, когда файлы хранятся в облаке, не рассматривается.
- Скачать исходники. В случае включения в код «как-есть» необходимо прописать пути в методе loadPaths
Регистрируем обработчик на событие OnFileSave. Обработчик будет вызван при сохранении файла. В обработчике каким-то способом получаем ID инфоблока, файл которого сохраняется. Сохраняем файл физически и возвращаем true.
- Регистрируем обработчик на событие OnFileSave модуля main.
Тут есть несколько важных моментов:
- Во-первых, как в методе CFile::SaveFile, так и в обработчике у нас нет идентификатора инфоблока.
- Во-вторых, $strSavePath в обработчик передается по значению, а не по ссылке, поэтому изменить его просто так не получится.
- Во-третьих, обработчик позволяет только определить собственный способ физического сохранения файла, в таблицу b_file пишет сам метод CFile::SaveFile.
Узнать ID инфоблока в обработчике можно несколькими путями:
- Путь 1: Значение из $_REQUEST.
При редактировании элемента в административной части url имеет вид /bitrix/admin/iblock_element_edit.php?IBLOCK_ID=170&type=catalog&ID=388118&lang=ru&find_section_section=-1&WF=Y
и, соответственно, в $_REQUEST у нас есть IBLOCK_ID
Этот метод не универсален, т.к. не поддерживает добавление с помощью API (например, из публичной части).
Кроме того, при сохранении элемента может возникнуть ситуация, когда надо добавить элемент с файлом в другой инфоблок. - Путь 2: Сохранение инфоблока во время вызова события в статический член класса
На событиях обновления OnBeforeIBlockElementUpdate, OnAfterIBlockElementUpdate и OnIBlockElementSetPropertyValues сохранять в статический член класса ID инфоблока.
В данном случае нет нужного события (onBefore) для метода CIBlockElement::SetPropertyValuesEx
Кроме того, проблема с добавлением элемента с файлом в другой инфоблок также остается - Путь 3: Через функцию debug_backtrace().
Это ресурсозатратно, но узнать ID инфоблока можно более точно, чем в предыдущих методах.
Т.е. сохраняем физически файл именно так, как это делает сам Битрикс (учитывая все настройки модуля main)
В целом можно и повторно вызывать CFile::SaveFile с новым путем, а затем удалить вручную запись из базы (но делать так по вполне понятным причинам не стоит)
Обновляем поля $arFile
Все новые файлы нужных нам инфоблоков с этого момента будут в отдельной папке.
Источник
Массовое добавление картинок с другого сайта
Есть массив с картинками
Картинка точно есть.
Цитата |
---|
Антон Долганин пишет: Можно для начала попробовать |
ну если кодировка у строки верна.
Цитата |
---|
Артур Нойманн пишет: но все равно не работает |
Цитата |
---|
Артур Нойманн пишет: но все равно не работает |
Цитата |
---|
Антон Долганин пишет: Тогда ничем уже тут не поможешь. Я в таких случаях лезу и копаю код вплоть до дергания УРЛ, и что там приходит в заголовках. |
Не, ну что-то определенно не так.
Вот пример с вашей аватаркой:
Цитата |
---|
Артур Нойманн пишет: Не, с аватаркой вышло, а с фоткой не вышло |
То есть — берем именно каждую русскую букву и реплейсим на ее кодированное представление. (к сожалению, какой-то полноценной замены в виде одной функции не нашел)
Проверил — у меня работает. Единственное, что если в таких адресах встретится еще что-то необычное (например, немецкий умляут), то опять будет сбой и паттерн а-яА-Я надо будет расширять.
Источник