PHP 可以解压一个taz文件吗? (.tar.Z)

Can PHP decompress a taz file? (.tar.Z)

我试过用Zlib解压文件,但它只是说"Data error"并给了我一个空文件。

这是我试过的代码:

// 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,但我无法让它工作。有办法吗?

编辑: 这是我尝试过的更多代码。只是为了确保 file_get_contents 正常工作。我仍然得到 "data error".

$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 字符。这些都是什么人物?

按照这个urlhttps://kb.iu.edu/d/acsy你可以试试

<?php

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

如果您没有像 OS 这样的 Unix,请检查 https://kb.iu.edu/d/abck 是否有合适的程序。

文件是用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;
}

所以你想用 PHP 本地 解压一个 taz 文件?试试我的 new extension 吧!

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 压缩。

请试试这个。

 <?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 我还没有测试过,但我希望它对你有用。