Download Link generiert anstelle dem Slash(/) einen Unterstrich

guenter024

Erfahrenes Mitglied
Hi PHPler,

habe mal hier im Forum ein nützliches script gefunden um Dateien aus verschiedenen Ordnern in ein Array zu laden. Nach der Verweisabfrage zu einer bestimmten Datei wird das Array geladen und nach der angeforderten Datei gesucht. Falls diese vorhanden ist wird ein Downloadlink generiert und das Downloadfenster öffnet.

Bis hierher klappt soweit alles.
Nur der Download funktioniert nicht. Nun habe ich festgestellt, dass beim generieren des Links anstelle der Verzeichnis-/ ein Unterstrich eingesetzt wird.

Aus /downloads/pdf/datei.pdf wird _downloads_pdf_datei.pdf

Wenn ich aber den Pfad mit echo ausgebe stimmt der Verweis wieder.

Ich poste hier mal ein wenig Code:

Die erwähnte Array-Funktion:
PHP:
    $mdir = '../download';
    $fileId = array();

    function load2array($dir) {

        global $fileId;
        global $mdir;
        $handle = opendir($dir);

        while ($file = readdir($handle)) {
            if ($file != '.' && $file != '..') {
                $filepath = $dir.'/'.$file;
                $file = basename($filepath,".pdf");
                $fileId[$filepath] = $file;
                if (is_dir($dir.'/'.$file)) {
                    load2array($dir.'/'.$file);
                }
            }
        }
        closedir($handle);
    }
    load2array($mdir);

Das Force-Download-Script:
PHP:
    $filename = $_GET['filename'];

    foreach($fileId as $filepath => $name) {
        if($filename == $name) {
            header("Pragma: public");
            header("Expires: 0"); # set expiration time
            header("Cache-Control: no-cache, must-revalidate");
            # browser must download file from server instead of cache

            # force download dialog
            header("Content-Type: application/force-download");
            header("Content-Type: application/octet-stream");
            header("Content-Type: application/download");

            # use the Content-Disposition header to supply a recommended filename and
            # force the browser to display the save dialog.
            header('Content-Disposition: attachment; filename="'.$filepath.'"');


            # The Content-transfer-encoding header should be binary, since the file will be read
            # directly from the disk and the raw bytes passed to the downloading computer.
            # The Content-length header is useful to set for downloads. The browser will be able to
            # show a progress meter as a file downloads. The content-lenght can be determines by
            # filesize function returns the size of a file.

            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".filesize($filepath));

            readfile($filepath);
            exit(0);
        }

Wenn ich stattdessen dies schreibe wird sauber der Link ausgegeben:
PHP:
    foreach($fileId as $filepath => $name) {
        if($filename == $name) {

            echo $filepath."<br />";
            exit;
        }
    }

Hoffe jemand weis woran das liegt.

Danke im Voraus für Eure Hilfe.

Ciao Günter
 
Ein Dateiname kann kein Schrägstriche enthalten. Deswegen ersetzt dein Browser diese durch Unterstriche.
 
Ja, das ist natürlich richtig.

Ich habe nun mit der PHP-Funktion pathinfo() den Link zunächst gesplittet und die Einzelteile wieder einzeln nach Bedarf ins Force-Download-Script eingefügt.

Danke für deine Hilfe, jetzt klappts :)

Thema kann also als gelöst markiert werden.
 
Zurück