Több file letöltése egyszerre zipelve

Több file letöltése egyszerre zipelve
2021-01-05T12:50:51+01:00
2021-01-07T18:18:39+01:00
2022-12-06T16:41:51+01:00
tivisu
Sziasztok, több filet szeretnék egyszerre letölteni. Már találtam egy scriptet ahhoz, hogy kijelölhető legyen, hogy melyik fileokat tölteném le, viszont nem tudom, hogy lehetne beleépíteni, hogy a kijelölt fileokat tömörítse zip-be és úgy tölthessem le.

<?php $reload = $_SERVER['PHP_SELF']; ?> <form name='download' method='post' name='download' action="<?php $reload?>"> <?php $dir = "fileok/2021/2/1/"; if (is_dir($dir)) { if ($folder = opendir($dir)) { echo 'Current files: '; while (($file = readdir($folder)) !== false) { if (filetype($dir . $file) != 'dir') { echo "<br>&nbsp&nbsp<input type='checkbox' name='boxes[]' value='$file'>'$file'</input>"; } } closedir($folder); } session_start(); $_SESSION['dir'] = $dir; } ?> <br> <input type="submit" name="submit" value="Download selected file/s"/> </form> <?php if (isset($_POST['submit'])) { $dir = $_SESSION['dir']; $index = 0; echo 'Total count: ' . count($_POST['boxes']) . ''; while ($index < count($_POST['boxes'])) { if (isset($_POST['boxes'][$index])) { $file = $_POST['boxes'][$index]; $path = "$dir$file"; echo "<br>$path"; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($path)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($path)); ob_clean(); flush(); readfile($path); } else { echo "<br>Index: $index not set"; } $index++; } } ?>

Előre is köszönöm a segítségeteket.
T
Mutasd a teljes hozzászólást!
Szia!

Ez egy szerű általános letöltő szkript.
Hívhatod JS-ből  is ha úgy kell, de beincludolod a zipelő fájl végére és akkor megindul a letöltés.
A fájlnév átadást természetesen módosítani kell az a zip file neve kell legyen.

Letöltés végén a zip fájl törli, ezt ki lehet venni, de csak a szemét fog gyűlni.

<?php $file_name = $_GET['file_path']; if(file_exists($file_name)) { header('Content-Description: File Transfer'); header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="'.basename($file_name).'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_name)); flush(); readfile($file_name); unlink($file_name); exit; } else{ header('Content-Type: text/html; charset=utf-8'); echo "Nem taláható a " . $file_name; } ?>
Mutasd a teljes hozzászólást!

  • Nézd meg esetleg ezt
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ, de épp itt a probléma, hogy nem tudom behelyettesíteni... :(
    Mutasd a teljes hozzászólást!
  • Akárhogy próbálkoztam... nem megy :(
    Mutasd a teljes hozzászólást!
  • Az lenne a legjobb, ha egyet töltök le, akkor csak azt a filet töltené le (ahogy most is működik), viszont ha kettőt vagy többet jelölnék ki, akkor zip-elve.
    Mutasd a teljes hozzászólást!
  • Szia!
    Adok egy konrét mintát:

    <?php header('Content-Type: text/html; charset=utf-8'); // itt beolvasod a kivánt fájlokat egy tömbbe $files = array($filename1, $filename2,...); // zio file neve $zip_nev = "teszt"; // a könytár ahol a fájlok vannak $konyvtar = "mappa"; $zip = new ZipArchive; $mentes_nev = ""; $zip_file_neve = "backup/". $zip_nev . "_" . date("Ymd_His",time()) . ".zip"; $tartalom = "A csomagolt file tartalma:" . PHP_EOL; if ($zip->open($zip_file_neve, ZipArchive::CREATE) === TRUE){ foreach($files as $file){ $mentes_nev = $file; if(file_exists($konyvtar . '/' . $file)){ $zip->addFile($konyvtar . '/' .$file, $mentes_nev); $tartalom .= $mentes_nev . PHP_EOL; // a zip tartalmának beírása egy text fájlba } else{ $tartalom .= $mentes_nev . " A fájl nem található az adott helyen!" . PHP_EOL; } } $zip->addFile('tartalom.txt'); $zip->addFromString('tartalom.txt', $tartalom . PHP_EOL); // fájlok hozzáadva, zip bezárása. $zip->close(); echo $zip_file_neve; } else{ echo "nincs"; } ?>
    Mutasd a teljes hozzászólást!
  • Kipróbáltam a scriptet így, ahogy van, jól működik, viszont ez azt csinálja, hogy a könyvtárba beleolvas és egy meghatározott mappába menti a zip-filet. Az a gondom, hogy a szervergépről kell lementeni a fileokat, és azt annak kell meghatározni, hogy hova akarja menteni, aki épp letölti. Nekem pont az lenne a lényeg, ahogyan megadtam a scriptet, vagyis az a script csak egy kijelölt filet tölt le egyszerre, viszont azt szeretném, ha pl 2 vagy több (az összes file) van kijelölve, akkor már zip-ként töltené le.
    Mutasd a teljes hozzászólást!
  • Igen, ez a script egy előre definiált könytárba tölti a zip fájt, viszont ezt a zip fájlt már csak le kell innen tölteni a kliens gépére ...
    Tudod, a nevét, helyét, rajta ...
    Mutasd a teljes hozzászólást!
  • Nos, lényegében letölthetném, de pont az a lényeg, hogy a kliens töltse le a gépére egy gombnyomással a választott fileokat. Semmi ftp vagy más módszer. Sajnos itt nálam most az a gond, hogy még egyáltalán nincs tapasztalatom a zip fileok létrehozásában és letöltésében. Ahogy mondtam is, ez így OK, hogy letölti valahova, de az a lényeg, ahogyan a scriptem is működik, hogy ki tudjon választani a kliens egy vagy több filet és azt oda töltse a gépére, ahova akarja. Ha egy filet választ, akkor magát a filet töltse le, ha viszont egynél többet, akkor zip-ként...
    Mutasd a teljes hozzászólást!
  • Tulajdonképpen ott vagy a kapuban, zip fájlt létre tudsz hozni, tudsz fájlt letölteni, akkor már csak az van hátra, hogy biztosíts a kliensnek egy lehetőséget, hogy fájlokat válasszon a szerverről ...
    A kliens által kiválasztott fájlokat adod át a zipelést végző scriptnek, kész a zip fájl, és elindítasz egy automatikus letöltést ...

    A fájl kiválasztásnál nagyon vigyázz, hogy a kliens ne tudjon bejutni az oldalad gyökerébe, csakis kizárólad az adatfájlokat tartalmazó mappát láthatja.
    Mutasd a teljes hozzászólást!
  • Értelek, tehát a fájlok felmásolásakor létrehozom a zip fájlt is és csak egy gombot adok neki, hogy a zip filet letöltse. Nos, ez is egy megoldás... akkor viszont mégis meghagyom a "gombos" megoldást és ha pl van 3 fájl + a 4. a zip, akkor kiválaszthatja, hogy csak egyet tölt le, vagy mindet... Nekem szebbnek tűnik az a verzió, amit szeretnék, de ha gondolod, hogy ez így egyszerűbb, akkor lehet, hogy ez marad.
    Mutasd a teljes hozzászólást!
  • Szerintem félre értettél, vagy én nem értem igazán a célodat mert azt nem igazán részletezted, csak azt, hogy tömörítve szeretnégd letölteni

    Gondoltam, hogy bizonyos fájlokat (pl. képeket) felltöltesz a szerveredre és lehetővé teszed azok megnézését, esetleg letöltését. 
    Ebben az esetben a felhasználó választhat egyszerre többet is és azokat tömöríted. Jól gondolom?
    Mutasd a teljes hozzászólást!
  • docx, jpg, eps, psd, ai... fájlok is lehetnek a mappában. A felhasználó dönti el, hogy ezekből csak a docx-et tölti le vagy, ha pl van több kép, akkor kiválasztja, amelyik kell neki. Ezért kell az, hogy checkbox-al válogathasson. Mint láttad a scriptemben:
    <input type='checkbox' name='boxes[]' value='$file'>'$file'</input>
    ahány fájl van, annyi checkbox jelenik meg. Kijelölve (checked) a checkboxot választja ki, hogy melyik fájlt tölti le - de így csak egyet lehet, pontosabban egyesével. Azért kellett az, hogy amikor kettőt vagy többet választ ki, akkor a submit megnyomásával zip-elve töltse le a kiválasztottakat.
    Mutasd a teljes hozzászólást!
  • OK!
    Mostmár értem, én is ilyesmire gondoltam. Gondolom a kliens oldalon használsz JS-t.

    A felhasználó kiválogatja amit szeretne, ezeket az adtokat visszaküldöd a szerverre egy tömbben, ami a kiválasztott fájlok neveit tartalmazza. Na, ezt a tömböt átadod a zipelő scriptnek, az becsomagolja, nevét, helyét tudod, már csak elindítasz egy automatikus letoltést. Gondolom az már megy, hiszen egyes letöltést említetted, hogy csináltál. Ha nem megy az automatikus letöltés, holnap arra is küldök példát.

    Habár az eredeti kérdés meg van oldva ... :)
    Mutasd a teljes hozzászólást!
  • Szia!

    Ez egy szerű általános letöltő szkript.
    Hívhatod JS-ből  is ha úgy kell, de beincludolod a zipelő fájl végére és akkor megindul a letöltés.
    A fájlnév átadást természetesen módosítani kell az a zip file neve kell legyen.

    Letöltés végén a zip fájl törli, ezt ki lehet venni, de csak a szemét fog gyűlni.

    <?php $file_name = $_GET['file_path']; if(file_exists($file_name)) { header('Content-Description: File Transfer'); header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="'.basename($file_name).'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_name)); flush(); readfile($file_name); unlink($file_name); exit; } else{ header('Content-Type: text/html; charset=utf-8'); echo "Nem taláható a " . $file_name; } ?>
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd