# Brauche PHP & HTML Code zum starten einer Download



## morice56 (11. Januar 2019)

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.

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  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


----------



## Corn696 (13. Januar 2019)

morice56 schrieb:


> 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


----------



## fotoman (13. Januar 2019)

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!


----------



## Corn696 (13. Januar 2019)

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.


----------



## morice56 (13. Januar 2019)

fotoman schrieb:


> 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.
> 
> ...



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.


----------



## fotoman (14. Januar 2019)

morice56 schrieb:


> 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
// Ö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>
  <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.



Corn696 schrieb:


> 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.


----------



## ZAM (15. Januar 2019)

fotoman schrieb:


> würde ich eher sowas verwenden
> GitHub - saleemkce/downloadable: Highly powerful download script written in PHP, downloads web assets in seconds!



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


----------



## fotoman (15. Januar 2019)

ZAM schrieb:


> 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.


----------



## Bunkasan (15. Januar 2019)

fotoman schrieb:


> 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...


----------



## ZAM (16. Januar 2019)

fotoman schrieb:


> 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. 



Bunkasan schrieb:


> Dem aufmerksamen Wald und Wiesen Surfer wäre aufgefallen, dass die Anmeldung über HTTPS läuft. Nur der Rest nicht... wegen Werbung und so...


Das zuletzt erwähnte war mal das Problem  Ist aber nicht mehr relevant. Kommt Zeit, kommt globales SSL.


----------

