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