2016-02-09 2 views
13

J'ai essayé d'utiliser Zlib pour décompresser le fichier, mais il m'a juste dit "Data error" et m'a donné un fichier vide.Est-ce que PHP peut décompresser un fichier taz? (.tar.Z)

Voici le code que j'ai essayé:

// 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); 

J'ai aussi essayé de le décompresser dans certaines régions, allant de .tar.Z à .tar juste un fichier. J'ai essayé d'utiliser les fonctions lzw pour enlever le .Z, mais j'étais incapable de le faire fonctionner. Y a-t-il un moyen de faire cela?

EDIT: Voici un peu plus de code que j'ai essayé. Juste pour s'assurer que le file_get_contents fonctionnait. Je reçois toujours une "erreur de données".

$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: Je pense que la raison pour laquelle LZW ne fonctionnait pas parce que le contenu du fichier .tar.Z ressemble à ceci:

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

Les fonctions LZW J'ai essayé à la fois l'utilisation Caractères ASCII dans leurs dictionnaires. Quel genre de personnages sont-ils?

+0

Voulez-vous que cela soit fait par php pur? Courez-vous dans un serveur Linux? Avez-vous la possibilité d'exécuter 'exec' ou' shell_exec'? – Kishor

+0

Je ne peux pas utiliser 'exec' ou' shell_exec', et je préfère utiliser PHP pur. – UndoingTech

+0

ne chaîner des fonctions comme ça. vérifiez si 'file_get_contents()' était réellement capable de lire ce fichier. Si ce n'est pas le cas, il retournera boolean 'false', qui sera ensuite transmis aveuglément à zlib_decode(), qui ne peut bien sûr pas décoder un' false' - booléen false dans un contexte de chaîne est une chaîne vide. –

Répondre

4

Vous voulez décompresser un fichier Taz natif avec PHP? Essayez mon 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'); 

A noter également, la raison pour laquelle les fonctions de zlib ne fonctionnent pas est parce que vous avez besoin de compression LZW, pas la compression gzip.

+1

Beaucoup de travail pour 50 points! Joli! – miken32

1

selon cette url https://kb.iu.edu/d/acsy vous pouvez essayer

<?php 

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

si vous ne disposez pas d'Unix comme OS pour vérifier https://kb.iu.edu/d/abck programme approprié.

+0

OP a déclaré ne pas être intéressé dans une source externe "je ne peux pas utiliser exec ou shell_exec, et je préfère utiliser PHP pur", et d'ailleurs, vous pouvez aussi bien exécuter ceci via "tar" pendant que vous y êtes. – quickshiftin

0

Le fichier est compressé avec la compression LZW, et j'en ai essayé quelques-uns mais il semble n'y avoir aucune méthode fiable pour les décompresser en PHP. La réponse de Cosmin contient la première étape correcte, mais après avoir utilisé l'utilitaire uncompress de votre système pour décompresser le fichier, vous devez toujours extraire le fichier TAR. Cela peut être fait avec les outils intégrés de PHP pour gérer ses fichiers PHAR personnalisés.

// 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; 
} 
+0

Si vous avez décidé d'utiliser le programme 'compress' externe, pourquoi utiliser' PharData'? Mai aussi bien le faire entièrement sur la ligne de commande à ce moment-là et sauvez-vous un peu de frappe et de performance ... – quickshiftin

+0

True, surtout juste pour attraper les erreurs d'une manière plus granulaire. – miken32

+0

Il existe maintenant [une méthode fiable] (https://github.com/quickshiftin/lzw-ext/blob/master/README.md) pour les décompresser en PHP :) – quickshiftin

-2

Veuillez essayer svp.

<?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 
    } 
    ?> 

Source: http://php.net/manual/en/phardata.extractto.php Je ne l'ai pas testé, mais j'espère que cela fonctionnera pour vous.

+0

Je viens de tester cette fonction qui a fonctionné pour moi. –

+1

Vous ne faites pas attention. Il doit d'abord décompresser un fichier en utilisant la compression LZW. – quickshiftin