[HTTP] Mehrere Downloads von einer Seite aus, möglichst gleichzeitig

  • HTML

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von StarGate01.

    [HTTP] Mehrere Downloads von einer Seite aus, möglichst gleichzeitig

    Hallo Liebe VB-P'ler,

    ich habe habe folgendes Problem:
    wie kann ich von einer Website mehrere Dateien (de facto einen Ordner) herunterladen OHNE sie auf dem Server zu Zippen?
    Soweit ich informiert bin werden multiple Downloads von Http nicht unterstüzt.
    Aber getreu dem Motto "Dem Inginör ist nichts zu schwör" bin ich auf dieses (zugegeben unschönes) Provisorium gekommen:

    index.html:
    Spoiler anzeigen

    HTML-Quellcode

    1. <!DOCTYPE HTML>
    2. <html>
    3. <head>
    4. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    5. <title>Multidownload test</title>
    6. </head>
    7. <body>
    8. <button id="download">Download</button>
    9. <div id="dl_frms"></div>
    10. <script type="text/javascript">
    11. $('#download').click(function() {
    12. $("#dl_frms").text("");
    13. //Dieses Array wird irgendwann mal dynamisch erstellt werden
    14. downloads = new Array('foobar2000.txt','bild.jpg','leer.zip', 'folder/file');
    15. add(0);
    16. function add(i){
    17. var iframe = '<iframe style="display:none; height:0px; width:0px;" src="download.php?file='+downloads[i]+'"></iframe>';
    18. $("#dl_frms").append(iframe);
    19. if(i < downloads.length-1){
    20. setTimeout(function() {add(i+1);},50);
    21. }
    22. }
    23. });
    24. </script>
    25. </body>
    26. </html>


    download.php:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. $path = 'files/';
    3. //Zuordung der Dateiamenserweiterungen zu ihren MIME-Typen
    4. function get_mime_type($filename) {
    5. $fileext = substr(strrchr($filename, '.'), 1);
    6. if (empty($fileext)) return (false);
    7. $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i";
    8. $lines = file('mime.types');
    9. foreach($lines as $line) {
    10. if (substr($line, 0, 1) == '#') continue;
    11. $line = rtrim($line) . " ";
    12. if (!preg_match($regex, $line, $matches)) continue;
    13. return ($matches[1]);
    14. }
    15. return (false);
    16. }
    17. //GET-Parameter überprüfen, Dateinamenserweiterungen herauslesen
    18. if(!$_GET['file']){
    19. die('000 no parameter given');
    20. }else{
    21. $file=$path.$_GET['file'];
    22. $ext=strtolower(substr(strrchr($file,'.'),1));
    23. }
    24. //Datei auf Vorhandensein und Lesbarkeit prüfen
    25. if(file_exists($file)){
    26. if(is_readable($file)){
    27. }else{
    28. die('500.2 file not readable');
    29. }
    30. }else{
    31. die('404 file not found');
    32. }
    33. //MIME-Typ ermittlen
    34. $mime=get_mime_type($file);
    35. if(!$ext){$mime="binary/octet-stream";}
    36. //Header und Datei rausschicken
    37. if ($mime){
    38. $size=filesize($file);
    39. if($fp=@fopen($file,'r')){
    40. header("Content-type: $mime");
    41. header("Content-Length: $size");
    42. header("Content-Disposition: attachment; filename=\"".substr(strrchr($file,"/"),1)."\"");
    43. fpassthru($fp);
    44. fclose($fp);
    45. exit;
    46. }
    47. }else{
    48. die('500.1 invalid MIME or extension');
    49. }
    50. ?>



    Der Nachteil dieser Methode: Der Benutzer wird mit unzumutbaren vielen Download-Prompts zugemüllt, es sei denn er benuzt die neueste Version von Chrome die Multiple Downloads zu verwalten weiß.

    Daher meine Frage: Ist es möglich, eine Ordner bzw. mehrere Dateien auf einen Schwapp herunterzuladen?
    SᴛᴀʀGᴀᴛᴇ01
    was spricht dagegen sie auf dem server zu zippen?
    oder noch gewagter ... warum lädst du diese nicht direkt als zip-archiv hoch?
    Hi slice, danke für deine Antwort
    Hochladen kann ich sie nicht als zip, da der Benutzer Die Dateiliste dynamisch zusammenstellen kann
    und sie auf dem Server zu zippen... Ich bin mir nicht ganz sicher wie das mit der Performance aussieht bei etwa sehr vielen Dateien und relativ vielen Benutzern
    SᴛᴀʀGᴀᴛᴇ01
    ok das ist natürlich ein argument, da heißt es einfach ausprobieren ...
    github.com/Grandt/PHPZip soll ganz interessant sein, damit erstellst du mehr oder weniger ein zip on the fly ohne es auf dem server zwischen zu speichern
    Okay, danke dir für den Link, jedoch stellt sich immer noch die Frage wie es dann aussieht bei Großen Datenmegen ("Zip.php generates the Zip file in memory (or tempfile)") und vielen Benutzern gleichzeitig. Ich werde mal einige Test machen.
    Ich denke mal dass iche s schlussendlich über zips laufen lassen werde.

    Doch ganz abgesehen davon mal reizt es mich immer noch das ursprüngliche Problem zu lösen, auch wenn es nicht mehr für mein Projekt relevant ist.
    SᴛᴀʀGᴀᴛᴇ01