我正在尝试提取一个.tar.gz,并使用bash在管道中进行压缩。管道使用rsync
选择应打包在更新中的文件,然后使用tar
压缩文件:
rsync -azp --files-from=${RSYNC_UPDATE_FILE} --ignore-missing-args src update
tar czf ${UFILE} update
当我使用WinRar之类的程序打开.tar.gz时,文件看起来正确。然后,我在应用程序中使用PHP提取更新。
# Get the full path where it should be extracted
$dirpath = $dirpath ?: File::dirname($zippath);
$phar = new \PharData($zippath);
# Check if it's compressed: e.g. tar.gz => tar
$zip = $phar->isCompressed() ? $phar->decompress() : $phar;
try {
# Extract it to the new dir
$extracted = $zip->extractTo($dirpath);
} catch (\Exception $e ) {
throw new CorruptedZip("Unable to open the archive.",424,$e);
}
提取的文件具有正确的权限,目录结构等,但我想它们仍在压缩中。这些文件都包含许多字符串组,而不是PHP代码。
02a0 048b 2235 bca8 ad5e 4f7e d9be ed1f
5b00 24d5 9248 8994 2c75 f778 e293 74db
6401 a802 0af5 55e1 52fc fb37 80ff f99f
谁能看到我错过的地方?
答案 0 :(得分:1)
知道了。该错误是由于未提及的过程引起的。 Laravel中的UploadedFile
类将文件的模仿类型解释为application/x-gzip
,扩展名为空,因此将生成的文件另存为[hashed_file_name].
而不是[hashed_file_name].tar.gz
。然后(在另一台服务器上)我使用GuzzleHttp
获取文件,并使用Symfony
猜测扩展名。
$extension = ExtensionGuesser::getInstance()->guess($contentType);
由于模仿类型的原因,使用Content-Type
标头获取扩展名的重建文件只是.gz
而不是.tar.gz
或.tgz
。对我的上传脚本进行的更改已将其修复。
$alias = $file->getClientOriginalName();
$mimetype = $file->getMimeType();
$extension = $file->guessClientExtension() ?: pathinfo($alias, PATHINFO_EXTENSION);
if ( ends_with($mimetype, 'x-gzip') && ends_with($alias, ['tar.gz', 'tgz']) ) {
$mimetype = 'application/tar+gzip';
$extension = 'tar.gz';
}
$hash = $file->hashName();
if ( ends_with($hash, '.') ) {
$hash .= $extension;
}
$path = $file->storeAs($storage, $hash);