dedlfix: Mit PHP Dateien im Browser anzeigen

Beitrag lesen

Tach!

Zwar öffnet sich die Word-Datei nicht - wie erhofft - im Browser, sondern der Browser fragt, was mit der Datei geschehen soll, aber egal.

Ach, gibt es denn Word als Plugin für Browser?

So sieht mein Code jetzt aus.

Teilweise unnötig ausführlich. Code breaks your Application. Deshalb ist es besser, auf entbehrliche Dinge zu verzichten.

$filename = basename($filefullpath);
$filesize = filesize($filefullpath);
$separator = ".";
$check = explode($separator, $filename);

$filename und $separator werden ein einziges Mal verwendet. Warum dann nicht gleich das "." als Stringliteral der Funktion explode() übergeben, und basename($filefullpath) als zweiten Parameter? $filesize hast du gar nicht verwendet, es stattdessen gleich so geschrieben:

  header('Content-Length: ' . filesize($filefullpath));  

Du brauchst die Dateigröße nicht am Anfang des Codes, also ermittle sie möglichst nicht so weit weg von ihrer Einsatzstelle. Du verlierst das nur aus den Augen - wie sich gezeigt hat.

if(count($check) > 1)

$check erklärt seine Bedeutung nicht. Was wird denn hier geprüft? Die Bedeutung muss man sich aus der Arbeitsweise des Programms ableiten. Dann weiß man aber nicht, ob das mit der Intention des Autors übereinstimmt. Sprechende Bezeichner könnten hier sehr beim Nachvollziehen helfen.

  $fileextension = strtolower($check[count($check) - 1]);  

Und warum beginnt die Erweiterung beim erstbesten Punkt? Nimm doch pathinfo() zum Zerlegen des Dateinamens! - Hmm, Kollateralschaden auf meiner Seite beim Code-Lesen. Da hab ich doch ein substr() hineininterpretiert. Wie auch immer, ich empfehle stattdessen end($filename_parts), wenn $filename_parts das Ergebnis des explode() beinhaltet, oder strrchr($filefullpath, '.') (Ergebnis allerdings inklusive Punkt) oder das schon erwähnte pathinfo(), was du ja auch gleich noch für andere Zwecke verwenden könntest.

  if($fileextension . "" === "pdf")  

$fileextension ist ein String. Hier noch einen Leerstring anzuhängen, ändert daran nichts. Welche Bewandnis hat die Typsicherheit beim Vergleich? Es gibt hier keinen Zweifel, dass du String mit String vergleichst. Ein Vergleich ohne Typüberprüfung tut's genauso und bringt exakt dasselbe Ergebnis.

  header('Content-Disposition: inline; filename='.basename($filefullpath));  

Ah, hier unten kommt noch ein zweiter Kandidat für $filename, aber die Chance hast du ausgelassen.

  ob\_clean();  
  flush();  
  readfile($filefullpath);	  

Die ersten beiden Anweisungen ergeben in dem Zusammenhang keinen Sinn. Wieso möchtest du denn den Ausgabepuffer leeren? Was ist denn da drin gelandet? Solltest du nicht besser dafür sorgen, dass gar nichts erst zur Ausgabe kommt? Und wenn nichts im Ausgabepuffer drin ist, was bringt dann ein Zwangsausgeben in Richtung Client? HTTP-Header senden? Das passiert sowie beim ersten Byte von readfile().

if(file_exists($filefullpath))

Gibts irgendwo noch eine Überprüfung, dass nur Dateien aus erlaubten Verzeichnissen abgefragt werden können?

dedlfix.