Czy istnieje bezpieczny sposób tworzenia archiwum zip lub tar.gz z php bez użycia polecenia exec?Tworzenie archiwum zip lub tar.gz bez exec
dzięki
Czy istnieje bezpieczny sposób tworzenia archiwum zip lub tar.gz z php bez użycia polecenia exec?Tworzenie archiwum zip lub tar.gz bez exec
dzięki
Jeśli chcesz utworzyć tar.gz i używasz PHP 5.3+, można użyć PharData klasę:
try
{
$a = new PharData('archive.tar');
// ADD FILES TO archive.tar FILE
$a->addFile('data.xls');
$a->addFile('index.php');
// COMPRESS archive.tar FILE. COMPRESSED FILE WILL BE archive.tar.gz
$a->compress(Phar::GZ);
// NOTE THAT BOTH FILES WILL EXISTS. SO IF YOU WANT YOU CAN UNLINK archive.tar
unlink('archive.tar');
}
catch (Exception $e)
{
echo "Exception : " . $e;
}
Przed odłączeniem pliku archive.tar upewnij się, że plik nadal nie jest otwarty - podczas próby wypróbowania wystąpił błąd - unset ($ a) zrobił lewę ^^ –
Użyj polecenia systemowego zamiast
http://php.net/manual/en/function.system.php
zwrócić uwagę na sekcji Uwagi na temat sposobu ochrony przed złośliwym wejścia.
EDIT: Użyj ZipArchive klasę aby utworzyć nowy zip przez open() polecenia http://www.php.net/manual/en/class.ziparchive.php
dziękuję, ale staram się być z dala od powłoki, ponieważ w wielu wspólnych hostingu te funkcje są wyłączone. –
@ el7r sprawdź moją edycję i zobacz, czy to działa dla ciebie –
Można użyć Zip klasy PHP do tworzenia plików zip, a ZLib do tworzenia plików gzip.
Tworzenie .zip
plik:
$zip = new ZipArchive();
$res = $zip->open('test.zip', ZipArchive::CREATE);
$zip->addFromString('test.txt', 'file content goes here');
$zip->addFile('data.txt', 'entryname.txt');
$zip->close();
Tworzenie .gz
plik:
$file = "test.txt";
$gzfile = "test.gz";
$fp = gzopen($gzfile, 'w9'); // w == write, 9 == highest compression
gzwrite($fp, file_get_contents($file));
gzclose($fp);
dziękuje, działa, czy mogę go wyodrębnić w podobny sposób? –
Oczywiście! Wystarczy przejrzeć dokumentację połączoną z powyższym - jest to dość łatwe do naśladowania. – foxy
Istnieje bardzo prosty sposób tworzenia Tar-a rchiwy bezpośrednio w PHP - możesz znaleźć KLASĘ pod numerem sourceforge od Dennisa Wronki w LGPL, dzięki czemu możesz używać jej również w komercyjnych skryptach.
<?php
/**
* @package PHPClassCollection
* @subpackage Tar
* @link classes
* @author Dennis Wronka <[email protected]>
*/
/**
* @package PHPClassCollection
* @subpackage Tar
* @link classes
* @author Dennis Wronka <[email protected]>
* @version 1.1
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPL 2.1
*/
class tar
{
/**
* The name of the tar-file to create.
*
* @var string
*/
var $filename;
/**
* The list of files to add to the archive.
*
* @var array
*/
var $filelist=array();
/**
* Constructor
*
* @param string $filename
*/
function tar($filename)
{
$this->filename=$filename;
}
/**
* Add a file.
*
* @param string $filename
*/
function add($filename)
{
if ((file_exists($filename)) && (is_readable($filename)))
{
$this->filelist[]=$filename;
}
}
/**
* Write the tar-file.
*
* @return bool
*/
function write()
{
sort($this->filelist);
[email protected]($this->filename,'w');
if ($tarfile==false)
{
return false;
}
for ($x=0;$x<count($this->filelist);$x++)
{
$filename=$this->filelist[$x];
if ((is_dir($this->filelist[$x])) && (substr($this->filelist[$x],-1)!='/'))
{
$filename.='/';
}
while (strlen($filename)<100)
{
$filename.=chr(0);
}
$permissions=sprintf('%o',fileperms($this->filelist[$x])).chr(0);
while (strlen($permissions)<8)
{
$permissions='0'.$permissions;
}
$userid=sprintf('%o',fileowner($this->filelist[$x])).chr(0);
while (strlen($userid)<8)
{
$userid='0'.$userid;
}
$groupid=sprintf('%o',filegroup($this->filelist[$x])).chr(0);
while (strlen($groupid)<8)
{
$groupid='0'.$groupid;
}
if (is_dir($this->filelist[$x]))
{
$filesize='0'.chr(0);
}
else
{
$filesize=sprintf('%o',filesize($this->filelist[$x])).chr(0);
}
while (strlen($filesize)<12)
{
$filesize='0'.$filesize;
}
$modtime=sprintf('%o',filectime($this->filelist[$x])).chr(0);
$checksum=' ';
if (is_dir($this->filelist[$x]))
{
$indicator=5;
}
else
{
$indicator=0;
}
$linkname='';
while (strlen($linkname)<100)
{
$linkname.=chr(0);
}
$ustar='ustar '.chr(0);
if (function_exists('posix_getpwuid'))
{
$user=posix_getpwuid(octdec($userid));
$user=$user['name'];
}
else
{
$user='';
}
while (strlen($user)<32)
{
$user.=chr(0);
}
if (function_exists('posix_getgrgid'))
{
$group=posix_getgrgid(octdec($groupid));
$group=$group['name'];
}
else
{
$group='';
}
while (strlen($group)<32)
{
$group.=chr(0);
}
$devmajor='';
while (strlen($devmajor)<8)
{
$devmajor.=chr(0);
}
$devminor='';
while (strlen($devminor)<8)
{
$devminor.=chr(0);
}
$prefix='';
while (strlen($prefix)<155)
{
$prefix.=chr(0);
}
$header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix;
while (strlen($header)<512)
{
$header.=chr(0);
}
$checksum=0;
for ($y=0;$y<strlen($header);$y++)
{
$checksum+=ord($header[$y]);
}
$checksum=sprintf('%o',$checksum).chr(0).' ';
while (strlen($checksum)<8)
{
$checksum='0'.$checksum;
}
$header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix;
while (strlen($header)<512)
{
$header.=chr(0);
}
fwrite($tarfile,$header);
if ($indicator==0)
{
$contentfile=fopen($this->filelist[$x],'r');
$data=fread($contentfile,filesize($this->filelist[$x]));
while (strlen($data)%512!=0)
{
$data.=chr(0);
}
fwrite($tarfile,$data);
}
}
fclose($tarfile);
return true;
}
}
?>
Poszukujesz archiwum PEAR. Istnieje wersja dla formatów zip i tar. – mario