Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   php архиватор (https://forum.antichat.xyz/showthread.php?t=69538)

-=M@N=- 06.05.2008 13:02

php архиватор
 
Ищу скрипт php архиватора, который сможет создавать архивы из нескольких файлов, например:

есть список предположим из 20 ссылок на файлы, возле кадой ссылки есть чекбокс. Если нажать просто на ссылку то качается один из 20 файлов, а если выделить несколько чекбоксов и ниже нажать кнопку скачать, то создается архив с сгенерированным именем на некоторе время(пусть будет 3 часа) , а в этом архиве будут выделенные чекбоком файлы. Через 3 часа архив должен сам удалится...

Чтото подобное реализовано здесь: http://gdmods.alibom.net/index.php?action=master&sm=show


зы: есть плагин для одного движка, там можно каждый файл архивировать по отдельности, но нельзя архивировать несколько файлов сразу, если пригодится я могу выложить

nerezus 06.05.2008 19:27

system("rar a -m0 $arc $files &")

-=M@N=- 06.05.2008 20:09

А можно маленький пример?
Что должно быть в $arc и $files ?

nerezus 06.05.2008 21:06

ну прочитай хелп к рару или другому архиватору.

Pernat1y 06.05.2008 21:23

http://ua.php.net/manual/ru/book.zip.php
у них-же есть модули для прямой работы с зип, бз2. зачем морочиться?

ShAnKaR 06.05.2008 23:18

под себя переделвал php class tar
PHP код:

<?
function Ch($b) {
$u=0;
for(
$i=0;$i<512;$i++)
$u+=ord($b[$i]);
for(
$i=0;$i<8;$i++)
$u-=ord($b[148+$i]);
$u+=ord(" ")*8;
return 
$u;
}

$arrfw=array('./');
$arrfile=array();
$ife=0;
while(++
$ife<=count($arrfw)){
$pathfw=$arrfw[$ife-1];
if(
is_readable($pathfw)){
if(
$hfw=opendir($pathfw)){
while(
false!==($ffw=readdir($hfw))){
$ffw=$pathfw.$ffw;
if(!
preg_match('/\/\.+$/',$ffw)){
if(
is_dir($ffw) && !preg_match('!/log$!',$ffw)){array_push($arrfw,$ffw.'/');print $ffw.'<br>';}
else 
array_push($arrfile,$ffw);
}}
closedir($hfw);}}}

$fpp=fopen('x.tar',"wb");


$pq=preg_quote($arrfw[0]);
array_shift($arrfw);
foreach(
$arrfw as $dn){
$in=@stat($dn);
$dn=preg_replace("!^$pq!",'',$dn);
$hr=str_pad($dn,100,"\0").str_pad(decoct($in["mode"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["uid"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["gid"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct(0),11,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["ctime"]),11,"0",STR_PAD_LEFT)."\0".str_repeat(" ",8)."5".str_repeat("\0",100).str_pad("ustar",6," ")." "."\0".str_pad("",32,"\0").str_pad("",32,"\0").str_repeat("\0",8).str_repeat("\0",8).str_repeat("\0",155).str_repeat("\0",12);
$cm=str_pad(decoct(Ch($hr)),6,"0",STR_PAD_LEFT);
for(
$i=0;$i<6;$i++){$hr[(148+$i)]=substr($cm,$i,1);}
$hr[154]="\0";
$hr[155]=" ";
fwrite($fpp,$hr);
}

foreach(
$arrfile as $fl){
if(
filesize($fl)>31457280)break;
$in=@stat($fl);
$fp=@fopen($fl,"rb");
$fi=@fread($fp,filesize($fl));
@
fclose($fp);
$fl=preg_replace("!^$pq!",'',$fl);
$he=str_pad($fl,100,"\0").str_pad(decoct($in["mode"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["uid"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["gid"]),7,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["size"]),11,"0",STR_PAD_LEFT)."\0".str_pad(decoct($in["ctime"]),11,"0",STR_PAD_LEFT)."\0".str_repeat(" ",8)."0".str_repeat("\0",100).str_pad("ustar",6," ")." \0".str_pad("",32,"\0").str_pad("",32,"\0").str_repeat("\0",183);
$cm=str_pad(decoct(Ch($he)),6,"0",STR_PAD_LEFT);
for(
$i=0;$i<6;$i++){$he[(148+$i)]=substr($cm,$i,1);}
$he[154]="\0";
$he[155]=" ";
$fi=str_pad($fi,(ceil($in["size"]/512)*512),"\0");
fwrite($fpp,$he.$fi);
}

fwrite($fpp,str_repeat("\0",512));
fclose($fpp);

после тара можно в gzip или bzip запихнуть это не проблема.

-=M@N=- 06.05.2008 23:26

у меня есть класс pclzip

просто я незнаю как засунуть в архим не один файл, а несколько выбранных...
чтобы заархивировать файл используется всего лиш одна функция которая передает классу данные для упаковки...я просто непонимаю как передать несколько файлов....

если надо, могу выложить сам класс

вот сама функция:

PHP код:

function file_funct($action,$dir,$file,$tmp="") {
    global 
$locale;

    
$error "";
    if (
$action == "add_arh") {
        
$file_name substr($file,0,strrpos($file,"."));
        if (!
file_exists(BASEDIR.$dir.$file)){$error $locale['fmf029']."<br>\n";}
        else if (
file_exists(BASEDIR.$dir.$file_name.".zip")){$error $locale['fmf028']."<br>\n";}
        if(!
$error) {
            
$pclzip = new PclZip(BASEDIR.$dir.$file_name.".zip");
            
$arh $pclzip->create(BASEDIR.$dir.$filePCLZIP_OPT_COMMENT"подпись к архиву"PCLZIP_OPT_REMOVE_PATHBASEDIR.$dir);
            if (
$arh == 0) {
                
$error $locale['fmf013']."<br>\n";
                
opentable("<center>".$locale['fmf020']."</center>");
                echo 
"<center>$error <a href='".FUSION_SELF."?dir=$dir'>".$locale['fmf022']."</a></center>";
                
closetable();
            } else {
                
chmod(BASEDIR.$dir.$file_name.".zip",0644);
                
redirect(FUSION_SELF."?dir=$dir");
            }
        } else {
            
opentable("<center>".$locale['fmf020']."</center>");
            echo 
"<center>$error <a href='".FUSION_SELF."?dir=$dir'>".$locale['fmf022']."</a></center>";
            
closetable();
        }
    } else {
        
redirect(FUSION_SELF."?dir=$dir");
    }



ShAnKaR 06.05.2008 23:30

на счет моего скрипта:
там массив дается
PHP код:

$arrfw=array('./'); 

это начальная папка, потом рекурсивно читаются все файлы в ней и по очереди тарятся, можно не делать рекурсию а в ручную на пихать в этот массив пути до нужных файлов.
вот и все.


Время: 09:04