Не могу розархивировать файл zip

239
17 декабря 2017, 11:04

Я принимаю файл zip в base64 в php скрипте, декодирую и записываю в файл, но после записи, архив не розархивируется. Нужна помощь

    <?php
/**
 * [unzipToThemesDir unzip template zip file to dir with tempates]
 * @param  [string] $pathToZIP [path to ZIP]
 * @param  [string] $pathToTemplates [path to templates dir]
 * @return [bool]       [true or false]
 */
function unzipToThemesDir($pathToZIP, $pathToTemplates, $theme_name){
    mkdir($pathToTemplates . $theme_name, 0777);
    $zip = new ZipArchive;
    if ($zip->open($pathToZIP) === TRUE) {
        $zip->extractTo($pathToTemplates . $theme_name);
        $zip->close();
        return true;
    } else {
        return false;
    }
}
/**
 * [getPathToThemes get path to dir with templates]
 * @param  [string] $cms_name [cms name]
 * @return [string]           [path]
 */
function getPathToThemes($cms_name){
    $name = strtolower($cms_name);
    $path = [
        'wordpress' => 'wp-content/themes/'
    ];
    return $path[$name];
}

/**
 * [getPathToOurTemplate create path to ZIP]
 * @param  [string] $path [path to template dir]
 * @param  [string] $name [theme name]
 * @return [string]       [path To ZIP]
 */
function getPathToOurZIP($path, $name){
    $name = strtolower($name);
    $name = explode(' ', $name);
    $name = implode('', $name);
    return $path . $name . '.zip';
}
/**
 * [createZIPfile Create zip archive from base64]
 * @param  [string] $base64 [zip file in base64]
 * @param  [string] $path   [path to template]
 * @return [bool]         [true of false]
 */
function createZIPfile($base64, $path){
    $zip = bindec(base64_decode($base64));
    if(!file_put_contents($path, $zip, FILE_BINARY)){
        return false;
    }
    return true;
}
function getDemoLink($url, $theme_name, $cms_name){
    $cms_name = strtolower($cms_name);
    if($cms_name == 'wordpress'){
        $link = $url . '/?themedemo=' . $theme_name;
    }
    return $link;
}
function getThemeName($theme_name){
    $theme_name = strtolower($theme_name);
    $theme_name = explode(' ', $theme_name);
    $theme_name = implode('', $theme_name);
    return $theme_name;
}
/**
 * [run script and display json response]
 */
function run(){
    $path = getPathToThemes($_POST['cms_name']);
    $theme_name = getThemeName($_POST['theme_name']);
    $pathToZIP = getPathToOurZIP($path, $theme_name);
    $result = ['err-flag' => false];
    if(!createZIPfile($_POST['zip'], $pathToZIP)){
       $result['err'] = 'Could not create ZIP';
       $result['err-flag'] = true;
    }
    if(!unzipToThemesDir($pathToZIP, $path, $theme_name)){
        $result['err'] = 'Could not unpackege ZIP';
        $result['err-flag'] = true;
    }
    $result['demo-url'] = getDemoLink($_POST['url'], $theme_name, $_POST['cms_name']);
    // response
    $response = json_encode($result);
    file_put_contents('response.txt', $response);
    echo($response);
}
run();

Код пересылки zip в base64 скрипту для разпаковки.

public function upload() {
        function curl_post($url, array $post = NULL, array $options = array()) { 
            $defaults = array( 
                CURLOPT_POST => 1, 
                CURLOPT_HEADER => 0, 
                CURLOPT_URL => $url, 
                CURLOPT_FRESH_CONNECT => 1, 
                CURLOPT_RETURNTRANSFER => 1, 
                CURLOPT_FORBID_REUSE => 1, 
                CURLOPT_TIMEOUT => 4, 
                CURLOPT_POSTFIELDS => http_build_query($post) 
            ); 
            $ch = curl_init(); 
            curl_setopt_array($ch, ($options + $defaults)); 
            if( ! $result = curl_exec($ch)) 
            { 
                trigger_error(curl_error($ch)); 
            } 
            curl_close($ch); 
            return $result; 
        } 
        $data = json_decode(Input::get('data'), true);
        $cmsname = DB::table('meta') -> select('meta_value') -> where('id', $data['cms']) -> get();
        $cmsname = $cmsname[0] -> meta_value;
        $response = curl_post('http://wp/upload-and-demo.php', [
            'cms_name' => $cmsname,
            'theme_name' => $data['template_name'],
            'url' => 'http://wp',
            'zip' => $data['zip']
        ]);
        file_put_contents('test.txt', $response);
        $response = json_decode($response, true);
        // INSERT TO DB
        $template_id = DB::table('templates')->insertGetId([
            'meta_cms' => $data['cms'],
            'date_at_create' => date('Y-m-d H:i:s'),
            'date_of_update' => date('Y-m-d H:i:s'),
            'link_on_demo' => $response['demo-url'],
            'name' => $data['template_name'],
            'meta_browsers' => json_encode($data['compatible-browsers']),
            'meta_tech' => json_encode($data['compatible-with']),
            'meta_file_type' => json_encode($data['file_type']),
            'count_column' => $data['column'],
            'meta_layout' => $data['layout'],
            'description' => $data['description']
        ]);
        foreach($data['keywords'] as $i => $keyword){
            DB::table('keywords') -> insert([
                'template_id' => $template_id,
                'key_name' => $keyword
            ]);
        }
        foreach($data['thumbnails'] as $i => $thumb){
            DB::table('thumbnails') -> insert([
                'template_id' => $template_id,
                'src' => $thumb,
                'item_index' => $i
            ]);
        }
        return 'true';
    }

Код отправки zip в base64 на сервер

$.ajax({
          method: "PATCH",
          url: "upload-template/",
          dataType: 'json',
          data: {'data' : JSON.stringify(data), '_token' : TOKEN}
        }).done(function(msg) {
            console.log(msg);
            callback();
        }).fail(function(msg){
            console.log(msg);
            fail();
        });

Код преобразования zip в base64 на клиенте

var reader = new FileReader();
        reader.onload = function(e){
            var dataUri = e.target.result;
            console.log(file.name);
            $('.zip-title').html(file.name);
            $('.zip-icon .material-icons').css('display', 'inline-block');
            $('.send-and-upload').css('display', 'inline-block');
            ZIP = dataUri;
        }
        reader.readAsDataURL(file);
READ ALSO
if (значения из бд == значения из массивов)

if (значения из бд == значения из массивов)

Добрый вечер! Подскажите как правильно написать код, суть в том мне нужно чтобы так работал: Пример - в базе данных значения:

213
Составления отчета из базы данных по нескольким таблицам

Составления отчета из базы данных по нескольким таблицам

Добрый день! Как составить отчет по нескольким таблицам? Все записи в таблицы заявки объединяются по году и недели в виде ссылкиНа другой...

204
Как записать в файл из другого сайта? [требует правки]

Как записать в файл из другого сайта? [требует правки]

Подскажите как собирать сообщения из других сайтов,есть 10 или больше сайтов на которых стоит реклама и на них есть обратная связь и вопрос...

226