Доброго дня. Столкнулся с проблемой, на форуме изучил много тем, но решения так и не нашел. В общем нагуглил готовый компонент для вывода файла из ИБ. Поставил, создал ИБ с нужными свойствами - всё выводится как нужно, НО, при переходе по ссылке "Скачать" и вместо открытия диалога для сохранения файла - выводит следующее:
template компонента (возможно кому интересно):
Сама ссылка выглядит вот так:
Обработчик download.php выглядит так:
Подскажите, в чем заключается подвох? За ранее благодарю за ответ по существу!
Следом и еще один вопрос. Если в ИБ несколько эементов с файлами, то он выводит их все. Что изменить в коде, чтоб можно было выводить конкретный элемент? Поди что "код информационного блока" -> "другое" -> конкретный SECTION_ID или я ошибаюсь?
Либо как вариант, подскажите какую часть кода нужно вставить в шаблон ИБ, чтоб при открытии статьи в конце можно было наблюдать ссылку для скачки файла, название оригинала и счетчик скачиваний. За ранее спасибо.
Код |
---|
file=Array ( [ID] => 56 [TIMESTAMP_X] => 24.03.2015 12:13:45 [MODULE_ID] => iblock [HEIGHT] => 0 [WIDTH] => 0 [FILE_SIZE] => 574997 [CONTENT_TYPE] => application/zip [SUBDIR] => iblock/7a4 [FILE_NAME] => 7a42cfd6d703f975d4f13fcaf4d4789d.zip [ORIGINAL_NAME] => [999.bz]_muzon-online.zip [DESCRIPTION] => [HANDLER_ID] => [EXTERNAL_ID] => f96c47bae70c56beb53af8b9e91bb744 [~src] => ) ../. ./. ./. ./upload/iblock/7a4/7a42cfd6d703f975d4f13fcaf4d4789d.zip |
template компонента (возможно кому интересно):
Скрытый текст |
---|
<?if(!defined("B_PROLOG_INCLUDED";) || B_PROLOG_INCLUDED!==true)die(); //echo "<pre>fparams=";print_r($arParams); echo "</pre>"; // параметры компонента $iblock=CIBlock::GetFields($arParams["IBLOCK_ID"];); // параметры инфоблока //echo "<pre>iblock=";print_r($iblock); echo "</pre>"; ?> <div class="news-list"> <?if($arParams["DISPLAY_TOP_PAGER"];):?> <?=$arResult["NAV_STRING"]?><br /><?endif;?> <?foreach($arResult["ITEMS"] as $arItem):?> <? if(strlen($arItem['PROPERTIES']['file']['VALUE'];)<1)$arItem['NAME']=$arItem['NAME']."<span style='color:red'>файл не загружен</span>"; $rsFile = CFile::GetByID($arItem['PROPERTIES']['file']['VALUE'];); $arFile = $rsFile->Fetch(); //echo "<pre>file=";print_r($arFile); echo "</pre>"; $arItem['PROPERTIES']['counter']['VALUE']=(int)$arItem['PROPERTIES']['counter']['VALUE']; ?> <div> <a style="vertical-align:middle;" href="/downloads/download.php?id=<?=$arItem['IBLOCK_ID'].":".$arItem['ID']?>" target="_blank"> <?=($arItem["PREVIEW_PICTURE"]["SRC"]>"" ? "<img src='".$arItem["PREVIEW_PICTURE"]["SRC"]."'>": "<img src='/downloads/images/space.gif' width='".$iblock['PREVIEW_PICTURE']['DEFAULT_VALUE']['WIDTH']."' height='1'>";)?> <?=$arItem['NAME']?> <? // IBLOCK_ID $x=$arFile['FILE_SIZE']; if($arFile['FILE_SIZE']>1024*2) $x=number_format(($arFile['FILE_SIZE']/1024),2,'.',' ')."K"; if($arFile['FILE_SIZE']>1024*1024*2) $x=number_format(($arFile['FILE_SIZE']/1024/1024),2,'.',' ')."M"; echo " - ".$x; ?> (скачиваний: <?=$arItem['PROPERTIES']['counter']['VALUE']?>;) </a></div> <?endforeach;?> <?if($arParams["DISPLAY_BOTTOM_PAGER"];):?> <br /><br /><?=$arResult["NAV_STRING"]?><?endif;?> </div> |
Сама ссылка выглядит вот так:
Код |
---|
<a href="/downloads/download.php?id=<?=$arItem['IBLOCK_ID'].":".$arItem['ID']?>" target="_blank"> |
Обработчик download.php выглядит так:
Скрытый текст |
---|
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/iblock.php";); CModule::IncludeModule("iblock";); if(!isset($_GET['id'];))exit("ОШИБКА: не задан ID элемента!";); list($iblock_id,$id)=explode(":",$_GET['id'];); global $arFilter; $arSelect = Array("IBLOCK_ID","*";); //ID,DETAIL_PICTURE,DETAIL_TEXT, $arFilter = Array( "IBLOCK_ID"=>$iblock_id, "ID"=>$id, //"ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", ); $res = CIBlockElement::GetList(Array("SORT"=>"ASC";), $arFilter, false, false, $arSelect); for($cnt=0;$ob = $res->GetNextElement();){ //echo "<pre>file=";print_r($ob); echo "</pre>"; $prop = $ob->GetProperties(); // "<pre>prop=";print_r($prop); echo "</pre>"; } $rsFile = CFile::GetByID($prop['file']['VALUE'];); $arFile = $rsFile->Fetch(); echo "<pre>file=";print_r($arFile); echo "</pre>"; $fil="../. ./. ./. ./upload/".$arFile['SUBDIR']."/".$arFile["FILE_NAME"]; echo "<br>".$fil; if (file_exists($fil)) { //echo "===="; header("200 OK";); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Content-Disposition: attachment; filename=".str_replace(" ","_",$arFile['ORIGINAL_NAME'];)); // header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($fil)); ob_clean(); flush(); readfile($fil); CIBlockElement::SetPropertyValues($id, $iblock_id, ($prop['counter']['VALUE']+1), "counter";); exit; } else header("404 Not Found";); ?> |
Подскажите, в чем заключается подвох? За ранее благодарю за ответ по существу!
Следом и еще один вопрос. Если в ИБ несколько эементов с файлами, то он выводит их все. Что изменить в коде, чтоб можно было выводить конкретный элемент? Поди что "код информационного блока" -> "другое" -> конкретный SECTION_ID или я ошибаюсь?
Либо как вариант, подскажите какую часть кода нужно вставить в шаблон ИБ, чтоб при открытии статьи в конце можно было наблюдать ссылку для скачки файла, название оригинала и счетчик скачиваний. За ранее спасибо.