Renderlife
1/29/2019 - 6:23 AM

Скачиваем файлы в битрикс с оринальным названием и безопасно

<?//возможность скачать файла залитого в свойство ИБ с его первоначальным именем
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

function rus2translit($string)
{
    $converter = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',
        'л' => 'l',   'м' => 'm',   'н' => 'n',
        'о' => 'o',   'п' => 'p',   'р' => 'r',
        'с' => 's',   'т' => 't',   'у' => 'u',
        'ф' => 'f',   'х' => 'h',   'ц' => 'c',
        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
        'ь' => "_",  'ы' => 'y',   'ъ' => "_",
        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
 
        'А' => 'A',   'Б' => 'B',   'В' => 'V',
        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
        'И' => 'I',   'Й' => 'Y',   'К' => 'K',
        'Л' => 'L',   'М' => 'M',   'Н' => 'N',
        'О' => 'O',   'П' => 'P',   'Р' => 'R',
        'С' => 'S',   'Т' => 'T',   'У' => 'U',
        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
        'Ь' => "_",  'Ы' => 'Y',   'Ъ' => "_",
        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
    );
    return strtr($string, $converter);
}

if(isset($_GET['file'])){
      $F_ID=$_GET['file'];
      $IB_ID=$_GET['ibid'];
      $EL_ID=$_GET['elid'];
      $rsFile = CFile::GetByID($F_ID);
      $arFile = $rsFile->Fetch();
      $fName = $arFile["ORIGINAL_NAME"];
      
      // далее  от греха подальше нужно провести транслитерацию русских символов на английские
      $fName=rus2translit($fName);
      
      $arItem = [];
      $arSelect = array("ID", 'PROPERTY_FILES');
      $arFilter = array("IBLOCK_ID" => IntVal($IB_ID), "ELEMENT_ID" => IntVal($EL_ID), "ACTIVE_DATE" => "Y", "ACTIVE" => "Y");
      if (CModule::IncludeModule("iblock")) {
        $res = \CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
        while ($ob = $res->GetNextElement()) {
            $arFields = $ob->GetFields();
            $arItem = $arFields;
            // test gist rev
        }
      }

      // Для безопасности
      $perm = false;
      if (!empty($arItem['PROPERTY_FILES_VALUE'])) {
        foreach ($arItem['PROPERTY_FILES_VALUE'] as $key => $value) {
          if ($value == $F_ID) {
            $perm = true;
          }
        }

        //определяем тип файла
        $c_Type=$arFile["CONTENT_TYPE"];
        
        // опредеяем путь к файлу 
        $file = CFile::GetPath($F_ID);
        $file=$_SERVER['DOCUMENT_ROOT'].$file;
        
        //проверяем, а есть ли вообще этот файл
        if(!file_exists($file) && $perm)
        {
           die("Error: $file not found.");
        }
        else
        {
          header("Cache-Control: public");
          header("Content-Description: File Transfer");
          header("Content-Disposition: attachment; filename=".$fName);
          header("Content-Type: $c_Type");
          header("Content-Transfer-Encoding: binary");
          readfile($file);
        };
      }        
   } else {die("ОШИБКА: Не указан ID файла");};
?>
<?php foreach ($arItem['DISPLAY_PROPERTIES']['FILES']['VALUE'] as $key => $idFile): ?>
    <?php 
        // Получаем файл для скачивания с оригинальным названием
        $name = $arItem['DISPLAY_PROPERTIES']['FILES']['FILE_VALUE']['ORIGINAL_NAME'];
    ?>
    <a download href="/local/scripts/filedownload.php?file=<?=$idFile ?>&elid=<?=$arItem['ID'] ?>&ibid=<?=$arItem['IBLOCK_ID'] ?>" title="<?=$name ?>">
        <img src="<?= SITE_TEMPLATE_PATH ?>/img/load.jpg" />
    </a>
<?php endforeach ?> 
<div class="newspaper__description">
    <div class="newspaper__title">
        <?=$arItem['NAME']?>
    </div>
    <div class="newspaper__file">
        <?php 
            if (!empty($arItem['DISPLAY_PROPERTIES']['FILES']['FILE_VALUE']['ORIGINAL_NAME'])) {
                $exN = explode('.', $arItem['DISPLAY_PROPERTIES']['FILES']['FILE_VALUE']['ORIGINAL_NAME']);
                $ex = $exN[count($exN)-1];
            }
        ?>
        <?=strtoupper($ex) . ' ' ?>
        <?=CFile::FormatSize($arItem['DISPLAY_PROPERTIES']['FILES']['FILE_VALUE']['FILE_SIZE']);   ?>
    </div>
</div>
<div class="newspaper__download">
    <?php foreach ($arItem['DISPLAY_PROPERTIES']['FILES']['VALUE'] as $key => $idFile): ?>
        <?php 
            // Получаем файл для скачивания с оригинальным названием
            $name = $arItem['DISPLAY_PROPERTIES']['FILES']['FILE_VALUE']['ORIGINAL_NAME'];
        ?>
        <a download href="/local/scripts/filedownload.php?file=<?=$idFile ?>&elid=<?=$arItem['ID'] ?>&ibid=<?=$arItem['IBLOCK_ID'] ?>" title="<?=$name ?>">
            <img src="<?= SITE_TEMPLATE_PATH ?>/img/load.jpg" />
        </a>
    <?php endforeach ?>  
</div>