Datei Download in Schleife

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich habe hier ein kleines Script, das eine einzelne Datei herunterlädt. Nun soll das so erweitert werden, daß alle Dateien eines Ordners mit einem Mal geladen werden. Allerdings wird immer nur eine Datei geladen und dann gibt mir der Server die Meldung "Cannot modify header information - headers already sent by ..."

So sieht die Routine im Moment aus:
PHP:
function downFile($zieldatei){
    if ($fd = fopen ($zieldatei, "r")) {
        $fsize = filesize($zieldatei);
        header("Content-type: application/octet-stream");
        header('Content-Disposition: attachment; filename="'.basename($zieldatei).'"');
        header("Content-length: $fsize");
        while(!feof($fd)) {
            $buffer = fread($fd, 2048);
            echo $buffer;
        }
    }
    fclose ($fd);
    return;
}

$dateiliste = array();
if ($handle = @opendir("../lager/".$kdnr.'/'.$pid.'/')){
    while ($file = readdir($handle)){
        if (substr($file, 0, 32) == strtoupper(md5($pid)) && substr($file, 32, 3) != '-NP'){
            $quellpfad = $_SERVER["DOCUMENT_ROOT"].'/lager/'.$kdnr.'/'.$pid.'/';
            $quelldatei = $quellpfad.$file;
            downFile($quelldatei);
        }
    }
}
die();
Ist es möglich, daß das Script alle entsprechenden Dateien auf ein Mal lädt, oder muß ich die Dateien in eine zip Datei packen, um nur eine Datei zu laden?
 
Lösung
Wenn der Speichern-Dialog nicht das Problem ist, dann versuche diese Demo:
Code:
<?php
$files = glob('images/dia*.jpg');
var_dump($files);
?>
<!doctype html>
<html lang="de">

<head>
    <meta charset="UTF-8">
    <title>Multiple Download</title>
    <!-- https://github.com/eligrey/FileSaver.js -->
    <script src="js/FileSaver.js"></script>
</head>

<body>
    <script>
        const files = <?php echo json_encode($files); ?>;
        files.forEach(file => {
            download(file, file, {});
        });
    </script>
</body>

</html>
Den PHP-Teil am Anfang musst Du natürlich an deine Gegebenheiten anpassen.
un dann vom Server schnappen und zum client kopieren?
Die Dateien sind ja schon auf meinem Server. Und für einzelne Dateien funktioniert der Download ja auch. Aber alle Download Scripte, die ich gefunden habe, arbeiten mit Header, und dann sind wir wieder beim Ausgangsproblem. Nach der ersten Datei ist Schluß.
 
Beim Lesen dieses Threads habe ich den Eindruck bekommen, dass das, was Du vor hast, nicht geht und diese Diskussion bei Stackoverflow bestätigt das:
PHP multiple file download
Clientseitig kannst Du jedoch mit Javascript mehrere Downloads veranlassen, in etwa so wie ebenfalls bei Stackoverflow angegeben. Die Konsequenz ist jedoch, dass für jede Datei der Dialog für das Speichern aufpoppen würde. Für den Benutzer könnte das verwirrend sein.
 
@Sprint
Soll der Multiple Download nur für dich sein, oder für deine Besucher?
Wenn es nur für dich ist, kannst du das auch mit ftp machen PHP: FTP-Funktionen - Manual

Falls es für deine Besucher ist, solltest du so eine Verbindung natürlich nicht erlauben ,
wenn es da sichere Methoden gibt ,die deine Besucher nutzen könnten , wird dir das einer von den PHP Profis sicherlich genauer sagen können.
 
Beim Lesen dieses Threads habe ich den Eindruck bekommen, dass das, was Du vor hast, nicht geht und diese Diskussion bei Stackoverflow bestätigt das:
PHP multiple file download
Clientseitig kannst Du jedoch mit Javascript mehrere Downloads veranlassen, in etwa so wie ebenfalls bei Stackoverflow angegeben. Die Konsequenz ist jedoch, dass für jede Datei der Dialog für das Speichern aufpoppen würde. Für den Benutzer könnte das verwirrend sein.
Das hab ich schon fast befürchtet. Der Speichern Dialog wäre zwar nicht das Problem, da Safari dieses Spielchen zum Glück nicht macht, aber das Script hat sich standhaft geweigert, irgendwas zu machen. Weder der Browser, noch der Server haben irgendeine Meldung gebracht. Ich werde dann wohl doch auf die zip Datei ausweichen.
 
Wenn der Speichern-Dialog nicht das Problem ist, dann versuche diese Demo:
Code:
<?php
$files = glob('images/dia*.jpg');
var_dump($files);
?>
<!doctype html>
<html lang="de">

<head>
    <meta charset="UTF-8">
    <title>Multiple Download</title>
    <!-- https://github.com/eligrey/FileSaver.js -->
    <script src="js/FileSaver.js"></script>
</head>

<body>
    <script>
        const files = <?php echo json_encode($files); ?>;
        files.forEach(file => {
            download(file, file, {});
        });
    </script>
</body>

</html>
Den PHP-Teil am Anfang musst Du natürlich an deine Gegebenheiten anpassen.
 
Lösung
Wenn der Speichern-Dialog nicht das Problem ist, dann versuche diese Demo
Damit hat es funktioniert! Vielen Dank an alle für eure Unterstützung.

Kleiner Nachtrag: Es kann passieren, daß nicht alle Dateien geladen werden. Das ist ein Timing Problem des Browsers. Ich habe den download Befehl in ein Timeout von einer Sekunde gesetzt und dann werden alle Dateien geladen.
 
Zuletzt bearbeitet:
Zurück