Forum Webscript.Ru
Программирование => PHP => Тема начата: andtar от 30 Августа 2002, 20:53:22
-
В пхп есть возможно распаковывать zip архивы, gz вот знаю есть, а zip не слышал.
Короче когда файл загружают на сервер (copy();) нужно сделать проверку, что в архиве есть файл расширения *.pbo, и нет файла *.exe *.com *.bat в потивном случае мне должно прийти уведомление по email:)
-
Не знаю как zip, а rar под линукс есть. Но rar берет зиповские архивы.
-
/* $Id: zip.lib.php,v 1.6 2002/03/30 08:24:04 loic1 Exp $ */
/**
* Zip file creation class.
* Makes zip files.
*
* Based on :
*
* [url]http://www.zend.com/codex.php?id=535&single=1[/url]
* By Eric Mueller
*
* [url]http://www.zend.com/codex.php?id=470&single=1[/url]
* by Denis125
*
* a patch from Peter Listiak for last modified
* date and time of the compressed file
*
* Official ZIP file format: [url]http://www.pkware.com/appnote.txt[/url]
*
* @access public
*/
class zipfile
{
/**
* Array to store compressed data
*
* @var array $datasec
*/
var $datasec = array();
/**
* Central directory
*
* @var array $ctrl_dir
*/
var $ctrl_dir = array();
/**
* End of central directory record
*
* @var string $eof_ctrl_dir
*/
var $eof_ctrl_dir = "\\x50\\x4b\\x05\\x06\\x00\\x00\\x00\\x00";
/**
* Last offset position
*
* @var integer $old_offset
*/
var $old_offset = 0;
/**
* Converts an Unix timestamp to a four byte DOS date and time format (date
* in high two bytes, time in low two bytes allowing magnitude comparison).
*
* @param integer the current Unix timestamp
*
* @return integer the current date in a four byte DOS format
*
* @access private
*/
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray[\'year\'] < 1980) {
$timearray[\'year\'] = 1980;
$timearray[\'mon\'] = 1;
$timearray[\'mday\'] = 1;
$timearray[\'hours\'] = 0;
$timearray[\'minutes\'] = 0;
$timearray[\'seconds\'] = 0;
} // end if
return (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |
($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);
} // end of the \'unix2DosTime()\' method
/**
* Adds "file" to archive
*
* @param string file contents
* @param string name of the file in the archive (may contains the path)
* @param integer the current timestamp
*
* @access public
*/
function addFile($data, $name, $time = 0)
{
$name = str_replace(\'\\\\\', \'/\', $name);
$dtime = dechex($this->unix2DosTime($time));
$hexdtime = \'\\x\' . $dtime[6] . $dtime[7]
. \'\\x\' . $dtime[4] . $dtime[5]
. \'\\x\' . $dtime[2] . $dtime[3]
. \'\\x\' . $dtime[0] . $dtime[1];
eval(\'$hexdtime = "\' . $hexdtime . \'";\');
$fr = "\\x50\\x4b\\x03\\x04";
$fr .= "\\x14\\x00"; // ver needed to extract
$fr .= "\\x00\\x00"; // gen purpose bit flag
$fr .= "\\x08\\x00"; // compression method
$fr .= $hexdtime; // last mod time and date
// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack(\'V\', $crc); // crc32
$fr .= pack(\'V\', $c_len); // compressed filesize
$fr .= pack(\'V\', $unc_len); // uncompressed filesize
$fr .= pack(\'v\', strlen($name)); // length of filename
$fr .= pack(\'v\', 0); // extra field length
$fr .= $name;
// "file data" segment
$fr .= $zdata;
// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack(\'V\', $crc); // crc32
$fr .= pack(\'V\', $c_len); // compressed filesize
$fr .= pack(\'V\', $unc_len); // uncompressed filesize
// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode(\'\', $this->datasec));
// now add to central directory record
$cdrec = "\\x50\\x4b\\x01\\x02";
$cdrec .= "\\x00\\x00"; // version made by
$cdrec .= "\\x14\\x00"; // version needed to extract
$cdrec .= "\\x00\\x00"; // gen purpose bit flag
$cdrec .= "\\x08\\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack(\'V\', $crc); // crc32
$cdrec .= pack(\'V\', $c_len); // compressed filesize
$cdrec .= pack(\'V\', $unc_len); // uncompressed filesize
$cdrec .= pack(\'v\', strlen($name) ); // length of filename
$cdrec .= pack(\'v\', 0 ); // extra field length
$cdrec .= pack(\'v\', 0 ); // file comment length
$cdrec .= pack(\'v\', 0 ); // disk number start
$cdrec .= pack(\'v\', 0 ); // internal file attributes
$cdrec .= pack(\'V\', 32 ); // external file attributes - \'archive\' bit set
$cdrec .= pack(\'V\', $this -> old_offset ); // relative offset of local header
$this -> old_offset = $new_offset;
$cdrec .= $name;
// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the \'addFile()\' method
/**
* Dumps out file
*
* @return string the zipped file
*
* @access public
*/
function file()
{
$data = implode(\'\', $this -> datasec);
$ctrldir = implode(\'\', $this -> ctrl_dir);
return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack(\'v\', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack(\'v\', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack(\'V\', strlen($ctrldir)) . // size of central dir
pack(\'V\', strlen($data)) . // offset to start of central dir
"\\x00\\x00"; // .zip file comment length
} // end of the \'file()\' method
} // end of the \'zipfile\' class
?>
В Linux есть zip. man zip
[off]Не знаю
не знаешь, не говори.[/off]
-
[OFF]
не знаешь, не говори.
хочется ругнуться, но не буду... Я тебя лично раздражаю?[/OFF]
-
Dm
Чё то я не понял, класс готов, а как проверку на *.pbo сделать и другие файлы (в начале темы писал). Я вообще классами никогда не пользовался...
-
Dm, нахрен выдумывать.
Надо перво-наперво спросить возможно ли exec запускать.
if (answer==true){
exec("unzip -o \\"$DOCUMENT_ROOT/$dir$file_name\\" -d $DOCUMENT_ROOT/$dir");
$d=opendir($dir);
while(($e=readdir($d))!==false){
if ($e!="." && $e!="..")
if (stristr($e, ".pbo")) $pbo=true;
if (stristr($e, ".exe") || stristr($e, ".com") || stristr($e, ".bat")) $exe=true;
}
closedir($d);
if (@$pbo && !@$exe) mail(......);
-
опять не то че-то, в досе unzip вообще не распазнает. В пхп тем более
Alexandr может модуль какой нужен? На серверах типа km это работать будет.
-
опять не то че-то, в досе unzip вообще не распазнает.
unzip.exe закинь в корень.
может модуль какой нужен?
Да, ничё не надо.
На серверах типа km это работать будет.
Нет. Бесплатные хостеры запрещают exec.
-
Alexandr, этот класс универсален для любой ОС.
что касается exec\'ов - никто не мешает их использовать.
более детально на http://www.pkware.com/
[off]
Доктор, не обижайся ;)
[/off]
-
Dm Как пользоваться классом?
первый пост пост посмотри че мне надо
-
andtar
Подобный класс ( как и 150похожих ) можно найти на http://www.phpclasses.com
Alexandr
Угу. Особенно классно это будет работать на никсовой системе. Там только ехе и прулит...
-
Доктор
[OFF] и неттолько его...[/OFF]
-
а все-таки exec лучше испольховать, ни знаете сервер xaos поддерживает его?
-
Dm
ИМХО этот класс ему не поможет, ему ведь прочитать содержимое ZIP-архива нужно а не создать его.
andtar
вообще-то у php есть экстеншн для работы (только для чтения) с ZIP-архивами. Посмотри в phpinfo() подключен ли он (если честно, его редко подключают).
-
[OFF]
ThE0ReTiC
и неттолько его...
Тебя, надо понимать, тоже. С одной стороны плевать. Но с другой стороны интересно почему же это? Можно прям сюда, можно в приват.
[/OFF]
-
Макс
да, прогнал немного, этот класс для создания архивов.
для обратного процесса нужен другой класс.
см. http://www.phpconcept.net/phpzip-index.en.php3