Brauche PHP & HTML Code zum starten einer Download

morice56

Komplett-PC-Aufrüster(in)
Ich brauche eure Hilfe, brauche einen PHP 7 Code und die dazu gehörige HTML 5 Code zum starten einer Download wo die Datei im Localhost liegt.Und über Download link startet.:hail:

Das ganze Bitte so formulieren das es einfach verständlich ist, da wo ich den Code anpassen muss auf eigene Bedürfnisse.
Ich kriege das ganze nicht :wall: habe wenig PHP Erfahrung und hoffe nun Ihr könnt mir weiter helfen.

zB. habe ich diesen Code aus dem Internet aber ich weiß nicht wie ich oder wo ich den Code anpassen muss zB. auf den pfad wo die datei auf der festplatte hinterlegt ist oder den HTML teil zum starten von Download.

Hier der Code:

  • <?php
    // Öffnet das Verzeichnis wo dieses Script liegt.
    $verzeichnis = opendir('.');
    // Verzeichnis lesen
    while ($file = readDir($verzeichnis))
    {
    // Höhere Verzeichnisse nicht anzeigen!
    if ($file != "." && $file != "..")
    {
    // Dateityp filtern. Es werden nur .exe-Dateien angezeigt
    if (strstr($file, ".exe"))
    {
    // Dateiendung vom Dateinamen filtern
    $name = $file;
    // Link erstellen
    if(!intval($_GET['download']))
    { //Gib den Link nur aus, wenn kein Filedownload angefordert ist
    echo '<html>';
    echo '<head>';
    echo '<meta http-equiv="refresh" content="2; url=download.php?download=1">'; //nach 2 Sekunden wird der Download ausgeführt.
    echo '</head>';
    echo '<body>';
    echo 'Falls kein automatischer Download startet, hier klicken: ';
    echo "<a href=\"./$file\">$file</a><br>\n";
    echo '</body>';
    echo '</html>';
    }
    }
    }
    }
    closeDir($verzeichnis); // Verzeichnis schließen

    if(file_exists($name) AND intval($_GET['download']))
    {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($name));
    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($name));
    readfile($name);
    exit();
    }
  • ?>

könnte jemand mir tipps dazu geben.
Danke
 
Zuletzt bearbeitet:
zB. habe ich diesen Code aus dem Internet aber ich weiß nicht wie ich oder wo ich den Code anpassen muss zB. auf den pfad wo die datei auf der festplatte hinterlegt ist oder den HTML teil zum starten von Download.

Also in der ersten Zeile steht öffne das Verzeichnis ( $verzeichnis = opendir('.'); ), also dort das gewünschte Verzeichnis eintragen.

Gibt es eine Grund warum du nicht einfach das HTML Attribute download verwendest. Nur beim Internet Explorer muss man etwas tricksen.

HTML a download Attribute
 
Nur noch zwei Dinge zur Ausgangsfrage:

Bitte heute kein PHP5 mehr lernen/nutzen, sondern PHP7, wenn PHP5 nicht zwingend erforderlich ist und man weiss, dass es dort kein Sicherheitsrisiko darstellt. Der Support ist eingestellt und PHP hält nichts von Kompatibilität. Mit ein wenig "Glück" darfst Du den Code anpassen, bevor er produktiv läuft.

Das obige Beispiel wird nur mit kleinen Dateien funktionieren, da readfile die gesamte Datei auf dem Server auf einmal liest. Falls das mit dem Download-Attribut nicht funktioniert, würde ich eher sowas verwenden
GitHub - saleemkce/downloadable: Highly powerful download script written in PHP, downloads web assets in seconds!
 
Jup teilweise echt erschreckend wie viele Seiten dort draußen noch auf php5 laufen. Aber immerhin haben ja einige Hoster in der letzten Zeit php5 eingestellt.

War ganz lustig wie manche die zig Benachrichtigungen dazu ignoriert hatten und ihre Seite auf "einmal" nicht mehr lief und dann auf dem Hoster rumhaken.
 
Nur noch zwei Dinge zur Ausgangsfrage:

Bitte heute kein PHP5 mehr lernen/nutzen, sondern PHP7, wenn PHP5 nicht zwingend erforderlich ist und man weiss, dass es dort kein Sicherheitsrisiko darstellt. Der Support ist eingestellt und PHP hält nichts von Kompatibilität. Mit ein wenig "Glück" darfst Du den Code anpassen, bevor er produktiv läuft.

Wie und wo kann oder muss ich es auf meine gegebenheiten anpassen kannst du mir das sagen bitte.
Ich brauche es für die Schule. Grade mal paar stunden PHP und nun sollen wir sowas programmieren:wall:

Das obige Beispiel wird nur mit kleinen Dateien funktionieren, da readfile die gesamte Datei auf dem Server auf einmal liest. Falls das mit dem Download-Attribut nicht funktioniert, würde ich eher sowas verwenden
GitHub - saleemkce/downloadable: Highly powerful download script written in PHP, downloads web assets in seconds!

Ich hatte nur ganz kurz PHP in der Schule und muss nun so was hier programmieren daher brauche ich euer Hilfe weil ich das für die Schule brauche.
Ich meinte PHP 7 habe mich verschrieben
Wäre nett wenn man mir weiter helfen könnte.
 
Zuletzt bearbeitet:
Wäre nett wenn man mir weiter helfen könnte.
Hast Du denn die Antwort von Corn696 (das mit dem Download-Attribut) ausprobiert? Wenn dem Lehrer nicht die begründete Antwort genügt, dass es dafür (mittlerweile) bessere Lösungen als PHP gibt, dann hat er m.M.n. seinen Beruf als Informatiklehrer verfehlt. Auch das verlinkte Script wird keinen Download nach einem Abbruch wieder aufnehmen können und ist damit für größere Dateien ungeeignet

Ich habe Deinen Text mal auf das wichtigste zusammen gekürzt. Du willst nicht die erste Datei aus dem Ordner herunter laden, sondern eine, die Du angibst.

Folgendes auf dem Server als "download.php" abspeichern
PHP:
<?php
// Öffnet das Verzeichnis wo dieses Script liegt.
$name = "meinedatei.pdf";

if(file_exists($name))
{
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename='.basename($name));
  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($name));
  readfile($name);
  exit();
}
?>

Folgedes im selben Ordner als "index.html" abspeichern
HTML:
<HTML>
  <HEAD>
    <TITLE>
      Download-Test
    </TITLE>
  </HEAD>

  <body>
    <a href="download.php">download mit PHP</a>
    <br> <br>
    <a href="meinedatei.pdf" download>download mit 'download' Tag</a>
    <br> <br>
    <a href="meinedatei.pdf">anzeigen</a>
  </body>
</HTML>

Dann noch in den selben Ordner eine Datei (hier ein PDF-File, kann auch ein Bild sein, hauptsache es ist KLEIN(*) und der Browser könnte die Datei auch selber anzegien) legen, die im Beispiel "meinedatei.pdf" heißt.

Und dann "index.html" auf dem Server aufrufen. Nun kannst Du (bzw. zumindest ich auf meinem Server mit PHP 7.2 und FF 64) die Datei per PHP oder per HTML5-Attribut herunter laden oder im Browser anzeigen.

Je nach Nutzen musst du halt den Dateinamen im HTML oder PHP-Code austauschen. Man könnte ihn auch als Parameter übergeben, aber wie heisst das so schön, das bleibt dem geneigeten Leser als Übung überlassen

Was KLEIN(*) bedeutet, weiss ich nicht, das ging aus den paar Links, die ich gelesen habe, nicht hervor und es war mir auch schnurzpiepegal. Mal waren es 10MB, mal auch ein paar hundert. Zum Test auf dem eigenen Server (oder dem in PHP 7 integrierten) egal, beim Hoster hätte ich keine Lust, mir deshalb eine passenden Warnung einzufangen.

Jup teilweise echt erschreckend wie viele Seiten dort draußen noch auf php5 laufen.
Es gibt auch noch Hoster, die bis heute php 5.6 patched haben. Mal sehen, was in PHP 7.3 wieder alles nicht geht, damit ich wenigstens wieder gut 2 Jahre Ruhe habe.

Müsste ich mit meiner Seite nochmal anfangen, würde ich wohl das Geld für einen ASP.NET Server ausgeben und hätte dann Ruhe.
 
Hey, man sollte nicht von modernem PHP predigen und dann solch veralteten Gammel mit bspw. altem Array-Def, unnötigen Doublequotes bei jedem String, keinen Typ-"Sicherheit" bei den Methoden und Variablen etc. verlinken ;p
Ich predige garnichts, ich habe nur darauf hingewiesen, dass man PHP 5 leider vergessen kann. Aus meiner Sicht ist das ein riesengroßes Leider, für private Projekte, die nicht nur im abgeschotteten Heimnetz laufen, ist PHP m.M.n. völlig unbrauchbar, wenn man sich nicht ständig darum kümmern will. Und zwar nicht als irgendwelchen Designerwägungen sondern weil sich die Leute alle 2-3 Jahre dazu entscheiden, inkompatibele, neue Versionen heraus zu bringen.

Wenn Du etwas bessreres hast, dann immer her damit. Besser wie ein einfach readfile wird es allemal sein, wenn es zwingend PHP sein muss. Ob der Code für den hiesigen Zweck ein Security-Audit überstehen muss, wage ich auch zu bezweifeln.

Apropos "veralteten Gammel". falls die rote Farbe Deines Nicks irgendwas damit zu tun hat, dass Du nicht nur einfaches Forenmitglied hier bist, finde ich es schon "lustig", dass Du auf mögliche Securityprobleme in PHP-Code hinweist, aber immer noch nicht dafür sogst, dass man sich 2019 endlich per https mit dem PCGH-Forum anmelden kann. Bei der Größe des Forums ist die Sicherheit der User vermutlich irrelevant.
 
Zuletzt bearbeitet:
Apropos "veralteten Gammel". falls die rote Farbe Deines Nicks irgendwas damit zu tun hat, dass Du nicht nur einfaches Forenmitglied hier bist, finde ich es schon "lustig", dass Du auf mögliche Securityprobleme in PHP-Code hinweist, aber immer noch nicht dafür sogst, dass man sich 2019 endlich per https mit dem PCGH-Forum anmelden kann. Bei der Größe des Forums ist die Sicherheit der User vermutlich irrelevant.

Dem aufmerksamen Wald und Wiesen Surfer wäre aufgefallen, dass die Anmeldung über HTTPS läuft. Nur der Rest nicht... wegen Werbung und so... :schief:
 
Apropos "veralteten Gammel". falls die rote Farbe Deines Nicks irgendwas damit zu tun hat, dass Du nicht nur einfaches Forenmitglied hier bist, finde ich es schon "lustig", dass Du auf mögliche Securityprobleme in PHP-Code hinweist, aber immer noch nicht dafür sogst, dass man sich 2019 endlich per https mit dem PCGH-Forum anmelden kann. Bei der Größe des Forums ist die Sicherheit der User vermutlich irrelevant.

Zur (minderen) Relevanz und kommenden Dingen gibt es mind. einen Beitrag im Forum. :)

Dem aufmerksamen Wald und Wiesen Surfer wäre aufgefallen, dass die Anmeldung über HTTPS läuft. Nur der Rest nicht... wegen Werbung und so... :schief:
Das zuletzt erwähnte war mal das Problem ;) Ist aber nicht mehr relevant. Kommt Zeit, kommt globales SSL.
 
Zurück