Склеить zip архив

Nezhnayka

Новичок
Добрый день.

Ситуация такая, на примере битрикса. При обмене битрикса с 1С, а именно когда из 1С выгружаются файлы обмена на сайт, то они запаковываются в zip и этот архив разбивается на части загадочной 1С-овской функцией:
Код:
РазделитьФайл(ФайлНаДиске.ПолноеИмя, ОграничениеРазмераФрагмента);
Далее эти фрагменты zip-архива выгружаются на сайт и там так-же загадочно (битрикс не знаю) этот zip склеивается,и распаковывается.
Подскажите пожалуйста, может кто знает или догадывается каким функционалом этот архив склеивается в битриксе?

Спасибо.
 
Ступай к битриксоидам, здесь тебе точно с ним никто не поможет
 
Очевидное предположение, что бьется тупо побайтово на чанки максимального размера ОграничениеРазмераФрагмента, проверял?
 
Очевидное предположение, что бьется тупо побайтово на чанки
Да, оказалось довольно таки банально все:
Код:
 $buffer = "";
        for( $i=0; $i<100000; ++$i ){
            $filename = "big_file.part".$i;
           
            if(file_exists($filename)){
                $fp = fopen($filename,"r");
                $buffer .= fread($fp,filesize($filename));
                fclose($fp);
            } else {
                break;
            }
            $fp = fopen("filefinal.zip","w");
            fwrite($fp, $buffer);
            fclose($fp);
        }
Подобным кодом все склеил
 
Зачем? И так нормально распаковывается.
PHP:
// ....
<?php
public function init()
    {
        $this->_check_auth();

        if ( ($post_max_size = app\string2bytes(ini_get("post_max_size")) - 1024) < 0)
        {
            $post_max_size = 0;
        }

        (new app_1c_views_exchange_base())->init ( class_exists("ZipArchive"),  min ($post_max_size, 1024*1024*5) );
    }

    public function file()
    {
        $this->_check_auth();

        if (! ($filename = app_request::request("filename")) )
        {
            throw new app_1c_exceptions_import("Переменная \$_GET['filename'] не передана");
        }

        $this->_model->save_input_file($filename);

        if (preg_match("/\\.zip$/i", $filename))
        {
            app_sessions::add("1c_zip_files", $filename);
        }

        (new app_1c_views_exchange_base())->file();
    }
....
/* Распаковка архива */
        if (is_array($zip_files))
        {
            app_sessions::start();
            app_sessions::set("1c_import_catalog_state", "progress");
            app_sessions::set("1c_import_catalog_message", "Распаковка ZIP архивов");
            app_sessions::write_close();
       
            $this->unzip_files($zip_files, $base);
       
            app_sessions::start();
            app_sessions::delete("1c_zip_files");
        }


....

/**
    * Распаковка ZIP архивов
    * @param unknown $zip_files
    * @param unknown $base
    * @throws app_1c_exceptions_import
    * @return app_1c_models_catalog
    */
    private function unzip_files($zip_files, $base)
    {
        foreach (array_unique($zip_files) as $_file)
        {
            $_src = $base.$_file;
   
            $fs = new app_fs();
   
            if (!$fs->is_file_in_secure_dirrectory($_src, $base))
            {
                throw new app_1c_exceptions_import("Ошибка. Файл {$_src} находится вне безопасной директории {$base}: {$fs->getErrors(";")}");
            }
   
            $zip_arhive = new ZipArchive();
   
            if (! $zip_arhive->open($_src))
            {
                throw new app_1c_exceptions_import("Ошибка открытия {$_src}");
            }
   
            if (! $zip_arhive->extractTo($base))
            {
                throw new app_1c_exceptions_import("Ошибка распаковки ZIP архива {$_src} в {$base}");
            }
   
            $zip_arhive->close();
        }
   
        return $this;
    }

// ...
public function save_input_file($filename)
    {
        $fs = new app_fs();

        $base = "tmp/1c/".app_sessions::id()."/";
        $path = $base.$filename;
     
        if (! $fs->check_path_secure_symbols($filename) )
        {
            throw new app_1c_exceptions_import("Filename has unsecure symbols {$filename}");
        }
     
        if (!file_exists($base))
        {
            if (! $fs->mkdir($base) )
            {
                throw new app_1c_exceptions_import("Can't create base dir {$base}");
            }
        }
     
        // Проверем перед сохранением
        if (file_exists($path) || file_exists(dirname($path)))
        {
            if (! $fs->is_file_in_secure_dirrectory(file_exists($path) ? $path : dirname($path), $base) )
            {
                throw new app_1c_exceptions_import("Base dir failed for filename: {$fs->getErrors(";")}");
            }
        }
     
        if (!$fs->mkdir($dir = dirname($path), true))
        {
            throw new app_1c_exceptions_import("Can't create directory {$dir}");
        }
     
        if (! $fs->copy("php://input", $path))
        {
            throw new app_1c_exceptions_import("Ошибка копирования php://input в {$path}: {$fs->getErrors(";")}");
        }

        // Повторно проверим
        if (file_exists($path) || file_exists(dirname($path)))
        {
            if (! $fs->is_file_in_secure_dirrectory(file_exists($path) ? $path : dirname($path), $base) )
            {
                $fs->unlink($path);
                throw new app_1c_exceptions_import("Base dir failed for filename: {$fs->getErrors(";")}");
            }
        }
     
        return true;
    }
 
Последнее редактирование:
Мне не для битрикса, для самописной CMS разрабатываю обмен с 1С.
 
Сверху