Подтвердить что ты не робот

Может ли PHP распаковать файл taz? (.tar.Z)

Я попытался использовать Zlib для распаковки файла, но он просто сказал "Ошибка данных" и дал мне пустой файл.

Это код, который я пробовал:

// Open a new temp file to write new file to
$tempFile = fopen("tempFile", "w");
// Make sure tempFile is empty
ftruncate($tempFile, 0);

// Write new decompressed file 
fwrite($tempFile, zlib_decode(file_get_contents($path))); // $path = absolute path to data.tar.Z

// close temp file
fclose($tempFile);

Я также пытался распаковать его по частям, перейдя от .tar.Z к .tar только к файлу. Я попытался использовать функции lzw, чтобы снять .Z, но я не смог заставить его работать. Есть ли способ сделать это?

EDIT: Вот еще один код, который я попробовал. Просто убедитесь, что работает file_get_contents. Я все еще получаю "ошибку данных".

$tempFile = fopen("tempFile.tar", "w");
// Make sure tempFile is empty
ftruncate($tempFile, 0);

// Write new decompressed file 
$contents = file_get_contents($path);
if ($contents) {
    fwrite($tempFile, gzuncompress($contents));
}

// close temp file
fclose($tempFile);

EDIT2: Я думаю, причина, по которой LZW не работает, заключается в том, что содержимое файла .tar.Z выглядит следующим образом:

��3dЀ��0p���a�
H�H��ŋ3j��@�6l�

Функции LZW, которые я пробовал, используют оба слова ASCII в словарях. Что это за персонажи?

4b9b3361

Ответ 1

Итак, вы хотите распаковать файл taz изначально на PHP? Дайте моему новое расширение попробовать!

lzw_decompress_file('3240_05_1948-1998.tar.Z', '3240_05_1948-1998.tar');
$archive = new PharData('/tmp/3240_05_1948-1998.tar');
mkdir('unpacked');
$archive->extractTo('unpacked');

Также обратите внимание: причина, по которой функции zlib не работают, - это то, что вам нужно сжатие LZW, а не сжатие gzip.

Ответ 2

в соответствии с этим URL https://kb.iu.edu/d/acsy вы можете попробовать

<?php

$file = '/tmp/archive.z';
shell_exec("uncompress $file"); 

если у вас нет Unix как OS, проверьте https://kb.iu.edu/d/abck для соответствующей программы.

Ответ 3

Файл сжат с сжатием LZW, и я попробовал несколько, но, похоже, нет надежного метода для их декомпрессии в PHP. Ответ Cosmin содержит правильный первый шаг, но после использования вашей утилиты uncompress для распаковки файла вам все равно нужно извлечь файл TAR. Это можно сделать с помощью встроенных инструментов PHP для обработки пользовательских файлов PHAR.

// the file we're getting
$url = "ftp://ftp.ncdc.noaa.gov/pub/data/hourly_precip-3240/05/3240_05_2011-2011.tar.Z";
// where to save it
$output_dir = ".";
// get a temporary file name
$tempfile = sys_get_temp_dir() . basename($url);
// get the file
$compressed_data = file_get_contents($url);
if (empty($compressed_data)) {
    echo "error getting $url";
    exit;
}
// save it to a local file
$result = file_put_contents($tempfile, $compressed_data);
if (!$result) {
    echo "error saving data to $tempfile";
    exit;
}
// run the system uncompress utility
exec("/usr/bin/env uncompress $tempfile", $foo, $return);
if ($return == 0) {
    // uncompress strips the .Z off the filename
    $tempfile = preg_replace("/.Z$/", "", $tempfile);
    // remove .tar from the filename for use as a directory
    $tempdir = preg_replace("/.tar$/", "", basename($tempfile));
    try {
        // extract the tar file
        $tarchive = new PharData($tempfile);
        $tarchive->extractTo("$output_dir/$tempdir");
        // loop through the files
        $dir = new DirectoryIterator($tempdir);
        foreach ($dir as $file) {
            if (!$file->isDot()) {
                echo $file->getFileName() . "\n";
            }
        }
    } catch (Exception $e) {
        echo "Caught exception untarring: " . $e->getMessage();
        exit;
    }
} else {
    echo "uncompress returned error code $return";
    exit;
}

Ответ 4

Пожалуйста, попробуйте это.

 <?php
    try {
        $phar = new PharData('myphar.tar');
        $phar->extractTo('/full/path'); // extract all files
        $phar->extractTo('/another/path', 'file.txt'); // extract only file.txt
        $phar->extractTo('/this/path',
            array('file1.txt', 'file2.txt')); // extract 2 files only
        $phar->extractTo('/third/path', null, true); // extract all files, and overwrite
    } catch (Exception $e) {
        // handle errors
    }
    ?>

Источник: http://php.net/manual/en/phardata.extractto.php Я не тестировал его, но надеюсь, что он сработает для вас.