Извлечение .tar.gz с PHP после rsync - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь извлечь .tar.gz, который сжимаю в конвейере с помощью bash.Конвейер выбирает файлы, которые должны быть упакованы в обновление, используя rsync, а затем сжимает их с помощью tar:

rsync -azp --files-from=${RSYNC_UPDATE_FILE} --ignore-missing-args src update
tar czf ${UFILE} update

Файлы выглядят правильно, когда я открываю .tar.gz с помощью программы, подобной WinRar.,Затем я извлекаю обновление, используя 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);
}  

Извлеченные файлы имеют необходимые разрешения, структуру dir и т. Д., Но я думаю, они все еще сжаты.Все файлы содержат много групп строк, а не код 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

Кто-нибудь может увидеть, где я пропускаю шаг?

1 Ответ

0 голосов
/ 20 февраля 2019

Понял.Ошибка произошла из-за не упомянутого процесса.Класс UploadedFile в Laravel интерпретировал mimetype файла как application/x-gzip с пустым расширением, поэтому полученный файл был сохранен как [hashed_file_name]. вместо [hashed_file_name].tar.gz.Затем (на другом сервере) я использовал GuzzleHttp, чтобы получить файл, и Symfony, чтобы угадать расширение.

$extension = ExtensionGuesser::getInstance()->guess($contentType);

Из-за mimetype, перестроенный файл, используя заголовок 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);
...