Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Чтение файлов в JavaScript, FileReader



Можно импортировать на стороне сервера агентами. Но на стороне клиента нагляднее, видно сразу, что не загрузилось, какие ошибки.
есть пример простого парсера , который обрабатывает файл на стороне сервера  php

html php
<?CJSCore::init("ajax");?>
<input type="file" id="fileTires" accept="text"><br>
<button id="importStart">импортировать</button>
<div id="result"></div>
<table id="tableTires" border='1'></table>
javascript
$('#importStart').click(function(){
   if (window.FileReader && window.Blob) {
      // All the File APIs are supported.          
      var files = document.getElementById('fileTires').files;         
      if(files.length != 0){
         var file = files[0];             
         if(file.name.slice(-4)=='.csv'){ //проверка по типу
            var reader = new FileReader();
            reader.onload = function(event) {
               var contents = event.target.result;
               var lines = contents.split("\n");                   
               for (var i = 2; i<lines.length;  i++) { //читаем со 2й строки
                  //что-то делаем с lines[i]

                  linestr = '<tr><td>'+data+'</td><td  id="line'+i+'"></td></tr>'; 
                  $('#tableTires').append(linestr);
                  data = { 
                        'sessid': BX.bitrix_sessid(),
                        'site_id': BX.message('SITE_ID'),
                        action: 'add',
                        line_id: i,
                        item: lines[i]                        
                  };
                  setTimeout(function(data){
                     BX.ajax({
                        url: '/tools/ajax.php',
                        method: 'POST',
                        data: data,
                        dataType: 'json',
                        async: true,
                        onsuccess: function(result){
                           //result.LINE_ID номер строки  (data.line_id)
                           if (typeof(result.STATUS) != "undefined"){
                              if(result.STATUS == 0){
                                 $('#line'+result.LINE_ID).html('Нет бренда или секции');
                              }
                           }
                        },
                        onfailure: function(error){
                                console.log(error);
                            }
                     });   
                     },
                     100*i,
                     data      
                  );   
               }
            }
            reader.onerror = function(event) {
               $('#result').html("Файл не может быть прочитан! код " + event.target.error.code);
            };                
            reader.readAsText(file,'cp1251');
         }
         else{
            $('#result').html('Ошибка! тип файла не csv');   
         }
      }
      else {          
          $('#result').html('файл не выбран');

      }
   }
   else {
      // File and Blob are not supported
      $('#result').html('браузер не поддерживает данную технологию');
   }
});


файл на сервере php
<?
define("STOP_STATISTICS", true);
if(array_key_exists('site_id',$_REQUEST) && is_string($_REQUEST['site_id']))
 if($_REQUEST['site_id'] !== '' && preg_match('/^[a-z0-9_]{2}$/i',$_REQUEST['site_id']) === 1)
      define('SITE_ID',$_REQUEST['site_id']);
   

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/log.txt");

use Bitrix\Main\Loader,
   Bitrix\Main\Application;

CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
CUtil::JSPostUnescape();




 if (!check_bitrix_sessid() || $_SERVER["REQUEST_METHOD"] != "POST")
    return;

$arRes = array();
if (isset($_POST["action"]) && strlen($_POST["action"]) > 0){   
   if($_POST["action"]=="add"){
      $add = 0;
      $price = floor(intval($_POST["item"]["price"]));
      if($_POST["item"]["kod"] != ""){
         //выбираем по коду поставщика
         $arSelect = Array("IBLOCK_ID", "ID");
         $arFilter = Array("IBLOCK_ID"=>$arIblocks[$_POST["item"]["category"]],"PROPERTY_KOD_POST" => $_POST["item"]["kod"]);
         $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>1), $arSelect);
         if($ob = $res->GetNextElement()){
            //нашли по коду
            $arFields = $ob->GetFields();
            //обновляем   
            $el = new CIBlockElement;
            $el->Update($arFields["ID"], array("MODIFIED_BY"    => $USER->GetID(),"ACTIVE"=>"Y"));      

             CCatalogProduct::Update($arFields["ID"], array("QUANTITY"=>intval($_POST["item"]["quant"]))); //обновили доступное количество
             CPrice::SetBasePrice($arFields["ID"],$price,'RUB'); //обновили цену
             $add = 1;
             $arRes["FIND"] = $arFields;
         }      
      }
      if($add == 0){
         //ищем по параметрам, если нашли, то обновляем и код добавляем
         //.. 
         //

         if($add==0){
            //добавляем 
            

         }         
      }
      $arRes["STATUS"] = $add;
      $arRes["LINE_ID"] = $_POST["line_id"];
   }
   elseif($_POST["action"]=="deactive_old"){
      $el = new CIBlockElement;
      $i = 0;
      $arSelect = Array("IBLOCK_ID", "ID", "NAME");
      $arFilter = Array(
         "IBLOCK_ID"=>$arIblocks,         
         "ACTIVE"=>"Y", 
         "<TIMESTAMP_X"=> array(ConvertTimeStamp(time()-30000 , "FULL"))
         );
      $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000), $arSelect);
      while($ob = $res->GetNextElement()){
         $i++;
         $arFields = $ob->GetFields();      
         $el->Update($arFields["ID"], array("ACTIVE"=>"N", 'TIMESTAMP_X' => FALSE));
      }      
      $arRes = $i.' деактивировано';
   }
}

$APPLICATION->RestartBuffer();
header('Content-Type: application/json; charset='.LANG_CHARSET);   
echo CUtil::PhpToJSObject($arRes);
die();
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!