Настройка скачивания сертификатов на товары 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка скачивания сертификатов на товары 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка скачивания сертификатов на товары 1С-Битрикс

Разница между отображением и скачиванием сертификатов — не только в кнопке «Скачать». Правильная настройка скачивания предполагает: контроль доступа к файлам, корректные имена файлов при скачивании, защиту от прямого перебора URL, и при необходимости — учёт скачиваний.

Прямые ссылки vs. контролируемая отдача файлов

Если файлы хранятся в /upload/ — прямые ссылки работают, но любой, кто знает URL, скачает файл без авторизации. Для публичных сертификатов это нормально. Для внутренних документов — нет.

Прямая ссылка (простейший вариант):

$fileInfo = \CFile::GetFileArray($fileId);
echo '<a href="' . $fileInfo['SRC'] . '" download>';

Контролируемая отдача через обработчик (если нужен контроль доступа или красивые имена файлов):

Создаёте файл /local/ajax/download-cert.php:

<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

$fileId = (int)$_GET['id'];
$productId = (int)$_GET['product_id'];

// Проверяем, что файл реально привязан к товару (защита от перебора)
$prop = \CIBlockElement::GetProperty(
    CATALOG_IBLOCK_ID,
    $productId,
    [],
    ['CODE' => 'CERTIFICATE']
);
$allowed = false;
while ($p = $prop->Fetch()) {
    if ((int)$p['VALUE'] === $fileId) {
        $allowed = true;
        break;
    }
}

if (!$allowed) {
    header('HTTP/1.0 403 Forbidden');
    die();
}

$fileInfo = \CFile::GetFileArray($fileId);
if (!$fileInfo) {
    header('HTTP/1.0 404 Not Found');
    die();
}

$filePath = $_SERVER['DOCUMENT_ROOT'] . $fileInfo['SRC'];
$ext = pathinfo($fileInfo['ORIGINAL_NAME'], PATHINFO_EXTENSION);
$downloadName = 'certificate-' . $productId . '.' . $ext;

header('Content-Type: ' . $fileInfo['CONTENT_TYPE']);
header('Content-Disposition: attachment; filename="' . $downloadName . '"');
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
exit();

Ссылка для скачивания:

<a href="/local/ajax/download-cert.php?id=<?= $fileId ?>&product_id=<?= $productId ?>">
    Скачать сертификат
</a>

Учёт скачиваний

Если нужно знать, сколько раз скачивали сертификат, — логируете в отдельную таблицу или через события Битрикса. Простейший вариант — таблица b_user_counter не подходит по семантике, делаете свою через \Bitrix\Main\Application::getConnection()->query() или создаёте HL-инфоблок CertDownloads с полями: UF_PRODUCT_ID, UF_FILE_ID, UF_USER_ID, UF_DATE, UF_IP.

Пакетное скачивание нескольких сертификатов

Если у товара несколько сертификатов и хотите предложить скачать все одним ZIP — используете PHP ZipArchive:

$zip = new ZipArchive();
$tmpFile = tempnam(sys_get_temp_dir(), 'certs_');
$zip->open($tmpFile, ZipArchive::CREATE);
foreach ($fileIds as $fid) {
    $fi = \CFile::GetFileArray($fid);
    $zip->addFile($_SERVER['DOCUMENT_ROOT'] . $fi['SRC'], $fi['ORIGINAL_NAME']);
}
$zip->close();
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="certificates.zip"');
readfile($tmpFile);
unlink($tmpFile);

Защита папки upload

Если хотите полностью закрыть прямой доступ к файлам в папке — кладёте их в /upload/protected/ и добавляете в .htaccess этой папки:

Deny from all

Тогда всё скачивание идёт только через ваш обработчик, и прямые URL не работают.

Этап Время
Настройка прямых ссылок на скачивание 1–2 ч
Разработка контролируемого обработчика 3–5 ч
Учёт скачиваний (опционально) 2–3 ч
Пакетное скачивание ZIP (опционально) 2–4 ч