php архиватор

Discussion in 'PHP' started by -=M@N=-, 6 May 2008.

  1. -=M@N=-

    -=M@N=- New Member

    Joined:
    26 Mar 2007
    Messages:
    22
    Likes Received:
    3
    Reputations:
    5
    Ищу скрипт php архиватора, который сможет создавать архивы из нескольких файлов, например:

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

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


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

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    system("rar a -m0 $arc $files &")
     
  3. -=M@N=-

    -=M@N=- New Member

    Joined:
    26 Mar 2007
    Messages:
    22
    Likes Received:
    3
    Reputations:
    5
    А можно маленький пример?
    Что должно быть в $arc и $files ?
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    ну прочитай хелп к рару или другому архиватору.
     
    1 person likes this.
  5. Pernat1y

    Pernat1y Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    477
    Likes Received:
    79
    Reputations:
    7
    http://ua.php.net/manual/ru/book.zip.php
    у них-же есть модули для прямой работы с зип, бз2. зачем морочиться?
     
  6. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    под себя переделвал 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 запихнуть это не проблема.
     
    #6 ShAnKaR, 6 May 2008
    Last edited: 6 May 2008
    1 person likes this.
  7. -=M@N=-

    -=M@N=- New Member

    Joined:
    26 Mar 2007
    Messages:
    22
    Likes Received:
    3
    Reputations:
    5
    у меня есть класс 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");
        }
    }
     
  8. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    на счет моего скрипта:
    там массив дается
    PHP:
    $arrfw=array('./'); 
    это начальная папка, потом рекурсивно читаются все файлы в ней и по очереди тарятся, можно не делать рекурсию а в ручную на пихать в этот массив пути до нужных файлов.
    вот и все.