PDF-Dateien in geschütztem Verzeichnis anzeigen
Walle
- php
0 Texter mit x0 Walle0 Der Martin0 Tom0 Tom0 Walle0 Tom
0 Header()
Tom
0 Texter mit x
Hallo,
ich möchte die Anzeige von PDF-Dateien in einem bestimmten Verzeichnis nur autorisierten Anwendern erlauben.
Ich habe daher einen Dialog realisiert, wo user und Passwor geprüft werden. Sind diese ok, wird eine Liste der vorhandenen PDF-Dateien angezeigt.
Wenn der Anwender nun auf eine klickt, soll diese PDF-Datei in einem eigenen Fesnster angezeigt werden.
Wenn ich dies mit
<a href="....">Dokname</a>
realisiere,
könnte man ja, wenn man Verzeichnis und Namen kennt das Dokument auch direkt aufrufen.
Wenn ich das Verzeichnis mit .htaccess schütze, funktioniert aber mein obiger href auch nicht.
Wie wird dies realisiert?
Gruß
Walle
Wenn ich das Verzeichnis mit .htaccess schütze, funktioniert aber mein obiger href auch nicht.
Das ist doch schon mal gut.
Wie wird dies realisiert?
Die Frage gibt es jeden Monat. Hast Du denn schon mal etwas gesucht, im Forum oder mit einer Suchmaschine? Das müßte Dir in einer Minute das gesuchte liefern.
readfile() ist dein Freund.
Hallo!
Die Frage gibt es jeden Monat. Hast Du denn schon mal etwas gesucht, im Forum oder mit einer Suchmaschine? Das müßte Dir in einer Minute das gesuchte liefern.
Das Problem ist "mit welchen Begriffen suchen?"
readfile() ist dein Freund.
Nach readfile zu suchen, wäre mir nie eingefallen.
Jetzt habe ich dies nachgeholt und gefunden:
<?php
$filename='D/test/Privat/Dok01.pdf';
print (header("Content-Type : application/pdf"));
print (header("Content-Disposition: attachment; filename=$filename"));
readfile($filename);
Das Ergebnis allerdings eine unleserliche Seite mit der Adresse
file:///C:/Users/myne/AppData/Local/Temp/D_test_Privat_Dok01.pdf-3.htm
Gruß
Walle
Hi,
Das Problem ist "mit welchen Begriffen suchen?"
stimmt, das ist oft das A und O beim schnellen Finden von interessanten Informationen.
readfile() ist dein Freund.
Nach readfile zu suchen, wäre mir nie eingefallen.
Naja, es ist auch nur ein Statist in dieser Szene, wenn auch ein wichtiger.
Jetzt habe ich dies nachgeholt und gefunden:
<?php
$filename='D/test/Privat/Dok01.pdf';
print (header("Content-Type : application/pdf"));
print (header("Content-Disposition: attachment; filename=$filename"));
readfile($filename);
WO hast du das so gefunden? Wenn irgendwo tatsächlich die kombinierte Verwendung von header() und print so empfohlen wird, sollte man den Verantwortlichen sofort darauf hinweisen. Das ist grob falsch - schon aus rein formalen Aspekten, denn header() hat keinen Rückgabewert, den man mit print sinnvoll ausgeben könnte.
In $filename scheint außerdem ein Doppelpunkt zu fehlen. (Windows-Laufwerksbezeichner?)
> Das Ergebnis allerdings eine unleserliche Seite mit der Adresse
> file:///C:/Users/myne/AppData/Local/Temp/D\_test\_Privat\_Dok01.pdf-3.htm
Ja. Das ist dann die logische Konsequenz. Möglicherweise hast du auch nicht bedacht, dass vor diesen header-Aufrufen absolut KEINE Ausgabe an den Client erfolgen darf - nicht einmal eine Leerzeile. Das wäre sowieso schädlich, wenn man eigentlich ein PDF-Dokument ausgeben möchte.
So long,
Martin
--
There are 10 types of people in the world: Those who understand the binary system, and those who don't.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hello,
Hallo!
Die Frage gibt es jeden Monat. Hast Du denn schon mal etwas gesucht, im Forum oder mit einer Suchmaschine? Das müßte Dir in einer Minute das gesuchte liefern.
Das Problem ist "mit welchen Begriffen suchen?"
readfile() ist dein Freund.
Nach readfile zu suchen, wäre mir nie eingefallen.
Jetzt habe ich dies nachgeholt und gefunden:
<?php
######################################
######################################
$filename='D:/test/Privat/Dok01.pdf';
print (header("Content-Type : application/pdf"));
##########
print (header('Content-Disposition: attachment; filename="' . basename($filename) . '"'));
##########
readfile($filename);
>
>
> Das Ergebnis allerdings eine unleserliche Seite mit der Adresse
> file:///C:/Users/myne/AppData/Local/Temp/D\_test\_Privat\_Dok01.pdf-3.htm
Probier es nochmal
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bikers-lodge.com>
Hello,
Hello,
Hallo!
Die Frage gibt es jeden Monat. Hast Du denn schon mal etwas gesucht, im Forum oder mit einer Suchmaschine? Das müßte Dir in einer Minute das gesuchte liefern.
Das Problem ist "mit welchen Begriffen suchen?"
readfile() ist dein Freund.
Nach readfile zu suchen, wäre mir nie eingefallen.
Jetzt habe ich dies nachgeholt und gefunden:
<?php
######################################
$filename='D/test/Privat/Dok01.pdf'; ???
######################################
$filename='D:/test/Privat/Dok01.pdf';
header("Content-Type : application/pdf");
##########
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
##########
readfile($filename);
> >
> >
> > Das Ergebnis allerdings eine unleserliche Seite mit der Adresse
> > file:///C:/Users/myne/AppData/Local/Temp/D\_test\_Privat\_Dok01.pdf-3.htm
>
>
> Probier es nochmal.
Ich aber auch :-O
Wusste doch, dass mir da eine Klammerebene zuviel war und ein 'print' bei den Headern...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bikers-lodge.com>
Hallo!
Nach dem $filename ist bei Dir ein > zuviel.
Aber auch ohne dies läuft es bei mir nicht.
Es öffnet sich das Fenster "Datei öffnen/speichern". Wenn ich öffnen auswähle kommt wieder unlesbares Zeug.
Mit welchem Browser klappt es bei Dir? Kann dies an meinen Firefox-Einstellungen liegen?
Gruß
Walle
Hello,
Hallo!
Nach dem $filename ist bei Dir ein > zuviel.
Das ist ein Quoting-Zeichen...
Das System hier muss noch perfektioniert werden, damit man Quotes und Reintext sauber voneienander trennen kann.
Aber auch ohne dies läuft es bei mir nicht.
Es öffnet sich das Fenster "Datei öffnen/speichern". Wenn ich öffnen auswähle kommt wieder unlesbares Zeug.
Dann schau dir mal zur Bestimmung des MIME-Types die Funktionen aus dem Artikel "File-Upload" an.
http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload
Die gelten selbstverständlich auch für die Bereitstellung eines Downloads.
Vielleicht passt Dein Content-Type ja einfach nicht zur Datei?
Oder Dein Browser hat mit dem Content-Type ein falsches Programm assoziiert?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Om nah hoo pez nyeetz, Tom!
Nach dem $filename ist bei Dir ein > zuviel.
Das ist ein Quoting-Zeichen...
Das System hier muss noch perfektioniert werden, damit man Quotes und Reintext sauber voneienander trennen kann.
Das entsteht, wenn man ein Quoting-Zeichen per Hand setzt und das nachfolgende Leerzeichen vergisst. Sein eigenes Zitatzeichen lässt sich komfortabel mithilfe der Edittools-Leiste zwischen Button-Leiste und Antwortfeld einfügen.
Mein Quoting-Zeichen ist das "»»".
»»Ohne Leerzeichen kein Zitat.
Jetzt habe ein „fremdes“ Zitatzeichen verwendet. → kein Zitat.
Unangemeldete Gäste sehen
> Mein Quoting-Zeichen ist das "»»".
»»Ohne Leerzeichen kein Zitat.
> Jetzt habe ein „fremdes“ Zitatzeichen verwendet. → kein Zitat.
Dabei ist nur die erste Zeile grau.
Matthias
Hallo!
In der Hoffnung, dass diesen alten thread noch jemand liest:
$filename='D:/test/Privat/Dok01.pdf';
header("Content-Type : application/pdf");
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
readfile($filename);
Bei Ausführung des o.g. Skripts wird das Fenster geöffnet
Öffnen mit ...
Datei speichern
.....
Kann man dieses Fenste unterdrücken und die PDF-Datei direkt öffnen?
Gruß
Walle
Mahlzeit,
In der Hoffnung, dass diesen alten thread noch jemand liest:
Ich hab auch immer die Hoffnung, dass jemand die Suche benutzt und dann Antworten auf solche Fragen findet, die schon zigmal beantwortet wurden.
Leider wird heute nur deine Hoffnung, nicht aber meine erfüllt.
Kann man dieses Fenste unterdrücken und die PDF-Datei direkt öffnen?
Natürlich. Jeder Browser bietet im Download-Fenster eine Option an die du aktivieren kannst. Dann wird das PDF im eingestellten Programm gestartet. Oft im Plugin, wenn installiert.
Das kann jeder User selbst einstellen, was ne feine Sache ist.
Hallo,
Das kann jeder User selbst einstellen, was ne feine Sache ist.
Das war aber nicht meine Frage, denn diese Möglichkeit kenne ich auch.
Ich möchte aber meinen zu 99% ungeübten Anwendern das PDF-Dokument direkt anzeigen, speichern will und kann kaum einer (so dass er es später wiederfindet). Und den Browser anpassen ist für sie auch zu viel verlangt.
Gruß
Walle
Mahlzeit,
Das war aber nicht meine Frage
Doch, genau das war deine Frage.
Ich zitiere:
"Kann man dieses Fenste unterdrücken und die PDF-Datei direkt öffnen?"
Ich möchte aber meinen zu 99% ungeübten Anwendern das PDF-Dokument direkt anzeigen, speichern will und kann kaum einer (so dass er es später wiederfindet). Und den Browser anpassen ist für sie auch zu viel verlangt.
Dann hast du noch ein zusätzliches Problem (1. du benutzt die Suche nicht, 2. du formulierst deine Fragen zu ungenau), es gibt keine zuverlässige Methode um dein Anliegen umzusetzen.
Wenn deine Besucher so unbedarft sind, dann ist ein PDF die völlig falscher Lösung, dann solltest du eine einfache HTML-Seite mit dem gleichen Inhalt ausliefern.
Das war aber nicht meine Frage
Doch, genau das war deine Frage.
Ich zitiere:"Kann man dieses Fenster unterdrücken und die PDF-Datei direkt öffnen?"
Lies doch den gesamten Beitrag. Unter 'man' ist natürlich der Autor des PHP-Skripts gemeint und nicht der Anwender.
Offenbar hat es Tom so verstanden.
Wenn deine Besucher so unbedarft sind, dann ist ein PDF die völlig falscher Lösung, dann solltest du eine einfache HTML-Seite mit dem gleichen Inhalt ausliefern.
Vielen Dank für diesen tollen Rat!
Wenn ich die Informationen in editierbarer Form und nicht als PDF vorliegen hätte, würde ich dies selbstverständlich so machen!
Aber vielleicht hast Du ein schlaues Programm, das eine PDF-Datei in (gute!) HTML umwandelt?
Mahlzeit,
Aber vielleicht hast Du ein schlaues Programm, das eine PDF-Datei in (gute!) HTML umwandelt?
Dummerweise hast du nach zweimaliger Aufforderung immer noch keine Suche benutzt. Also wieso sollte ich das für dich tun?
Mahlzeit,
Aber vielleicht hast Du ein schlaues Programm, das eine PDF-Datei in (gute!) HTML umwandelt?
Dummerweise hast du nach zweimaliger Aufforderung immer noch keine Suche benutzt. Also wieso sollte ich das für dich tun?
Von "rhetorischen Fragen hast Du wohl noch nichts gehört".
Aber nach Deinen bisherigen Ausführungen kann ich wohl annehmen, dass Du so vorgehen würdest!
Hello,
In der Hoffnung, dass diesen alten thread noch jemand liest:
probier es mal so. Kommt aber auf den Browser an, ob er das unterstützt.
$filename='D:/test/Privat/Dok01.pdf';
header("Content-Type: application/pdf");
header('Content-Disposition: inline; filename="' . basename($filename) . '"');
readfile($filename);
Und denke daran, den Doppelpunkt ohne Leerzeichen an den Header-Bezeichner anzuhängen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Tom.
probier es mal so. Kommt aber auf den Browser an, ob er das unterstützt.
$filename='D:/test/Privat/Dok01.pdf';
header("Content-Type: application/pdf");
header('Content-Disposition: inline; filename="' . basename($filename) . '"');
readfile($filename);
>
> Und denke daran, den Doppelpunkt ohne Leerzeichen an den Header-Bezeichner anzuhängen.
Das werde ich vermutlich nie mehr vergessen;-)
>
Ich erhalte jetzt:
"Format error or not a PDF-document"
Aber das liegt bestimmt wieder an einer Kleinigkeit, nach der ich aber erst morgen suchen kann.
Danke einstweilen!
Gruß
Walle
Hello Walle,
ich habe nochmal ein bisschen gebastelt.
Dabei habe ich gesehen, dass es äußerst bedauerlich ist, dass $php_errormsg nicht global vereinbart ist Dann könnte man sich die lästige Schreibarbeit mit $MYERRORMSG nämlich schenken. Zeigt mal wieder, dass PHP kein durchgängiges Konzept hat :-((
<?php ### download_file.php ### utf-8 ### ÄÖÜäöü
ini_set('track_errors', true);
$MYERRORMSG = false;
#--------------------------------------------------------------------------------------------------
function get_mime_type($path)
{
GLOBAL $MYERRORMSG;
if (version_compare(PHP_VERSION, '5.3.0') < 0)
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (!function_exists('finfo_open'))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (!$finfo = finfo_open(FILEINFO_MIME_TYPE))
{
$MYERRORMSG = $php_errormsg;
return false;
}
$mime_type = finfo_file($finfo, $path);
finfo_close($finfo);
return $mime_type;
}
#--------------------------------------------------------------------------------------------------
function download_file($filename, $attachment = false)
{
GLOBAL $MYERRORMSG;
$disposition = ($attachment?'attachment':'inline');
if (! $fh = @fopen($filename, 'rb'))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (! @flock($fh, LOCK_SH))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (! $mimetype = @get_mime_type($filename))
{
$MYERRORMSG = $php_errormsg;
return false;
}
header("Content-Type: $mimetype;");
header('Content-Disposition: ' . $disposition . '; filename="' . basename($filename) . '"');
fpassthru($fh);
# fclose($fp); übernimmt PHP für uns in diesem Fall durch Verlassen des Funktionsblockes
exit;
}
#================================================================================================
# php main
#================================================================================================
download_file('Aufgabe.pdf');
if ($MYERRORMSG) echo "<p>Letzter Fehler: $MYERRORMSG</p>\r\n";
?>
So ist das jetzt auch Race-Condition-fest, wenn gerade jemand was ändern will, während noch jemand runterlädt, vorausgesetzt, man nutzt für den Upload auch einen POSIX-konformen (FTP-)Client bzw. Prozess/Script.
Den Download könnte man nun auch noch Cache-freundlich gestalten, so dass die Dokumente nur runtergeladen werden, wenn sie erneuert worden sind. PDFs sind ja ganz schöne Klötze, und warum soll man die bei jedem "ich schau nochmal" des users erneut runterladen?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello Walle,
ich habe nochmal ein bisschen gebastelt.
Chapeau!
Du bist aber fleißig.
Ich freue mich aber erst auf meinen Urlaub, dann werde ich mich intensiv damit befassen!
Gruß
Walle
Den Download könnte man nun auch noch Cache-freundlich gestalten, so dass die Dokumente nur runtergeladen werden, wenn sie erneuert worden sind. PDFs sind ja ganz schöne Klötze, und warum soll man die bei jedem "ich schau nochmal" des users erneut runterladen?
Weil man Dateien, die nur bestimmten Nutzern zugänglich sein sollen, möglichst wenig cachen läßt?
Hello,
Den Download könnte man nun auch noch Cache-freundlich gestalten, so dass die Dokumente nur runtergeladen werden, wenn sie erneuert worden sind. PDFs sind ja ganz schöne Klötze, und warum soll man die bei jedem "ich schau nochmal" des users erneut runterladen?
Weil man Dateien, die nur bestimmten Nutzern zugänglich sein sollen, möglichst wenig cachen läßt?
Wenn es nur fünf sind, die sich das einmal ansehen und nie wieder...
Dann kann man sich den Aufwand vielleicht schenken.
Aber es ist ja gar nicht viel Aufwand.
Oder würdest Du generell ein Problem im Caching sehen?
Die Browser stehen üblicherweise auf "Auto".
Sendet der Server einen "Last-Modified"-Header mit, fragt der Browser üblicherweise beim nächsten Request mit "If-modified_since"-Header an.
Wenn keine Veränderung stattgefunden hat, kommt nur ein HTTP-Status 304 zurück.
Das ist doch vernünftig. Es spart megabyteweise Traffic. Das ist nicht nur für das Netz und den Client angenehm, sondern auch für das Script und den Server, auch wenn man nur an authorisierte User ausliefern will. Bei direkter Requestbehandlung durch den Apachen ist die Caching-Strategie mWn ohnehin eingeschaltet.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
~~~php
#------------------------------------------------------------------------------------------------
function download_file($filename)
{
header("Content-Type: application/pdf;");
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
readfile($filename);
exit;
}
#------------------------------------------------------------------------------------------------
funktioniert bei mir einwandfrei entweder mit Rückfragefenster bei "attachment" oder ohne Rückfragefenster mit "inline"
Ich musste aber vorher meine eigene Paranoia-Einstellung wieder auf Standard zurücksetzen:
![](http://selfhtml.bitworks.de/bilder/download_pdf.png)
Ich würde aber trotzdem die Ausgabe in ein neues Fenster umlenken mit einem Target-Attribut im aufrufenden HTML-Link. Sonst steht der User im Wald, wenn er den Acrobat (oder was er eben hat) wieder schließt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bikers-lodge.com>
Hallo,
funktioniert bei mir einwandfrei entweder mit Rückfragefenster bei "attachment" oder ohne Rückfragefenster mit "inline"
Bei mir auch, danke!
Aber was mir aufgefallen ist, ob basename angegeben oder nicht macht (zumindest bei mir) keinen Unterschied:
header('Content-Disposition: inline; filename="' . basename($filename) . '"');
=
header("Content-Disposition: inline; filename="$filename"");
=
header("Content-Disposition: inline; filename=$filename");
Gruß
Walle
Hello,
Aber was mir aufgefallen ist, ob basename angegeben oder nicht macht (zumindest bei mir) keinen Unterschied:
header('Content-Disposition: inline; filename="' . basename($filename) . '"');
=
header("Content-Disposition: inline; filename="$filename"");
=
header("Content-Disposition: inline; filename=$filename");
Wie meinst Du das? Welchen Namen schlägt denn der Client vor zum Speichern?
Kommt darauf an, ob du den Filenamen ohne Pfadangabe oder mit Pfadangabe übergibst.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
header("Content-Type: application/pdf");
^
Das hatten wir auch schon mal. Du hast da noch ein Leerzeichen vor dem Doppelpunkt. Ich weiß nicht, wie empfindlich dein Browser das auffasst. Es gehört jedenfalls nicht dahin, nur danach!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Tom,
das Leerzeichen war es! Oh diese kleinlichen Browser!
Danke für die Hilfe
Gruß
Walle
Hello Walle,
ich danke Dir für die Rückmeldung.
header("Content-Type: application/pdf");
^
das Leerzeichen war es! Oh diese kleinlichen Browser!
Dann nehme ich das jetzt mal in die "Liste der kleinen Fehler mit großer Wirkung" auf;-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
header("Content-Type: application/pdf");
Das hatten wir auch schon mal. Du hast da noch ein Leerzeichen vor dem Doppelpunkt. Ich weiß nicht, wie empfindlich dein Browser das auffasst. Es gehört jedenfalls nicht dahin, nur danach!
Nachtrag: Es sind vermutlich gar nicht die Browser, die hier streiken (hab ich noch nicht näher untersucht), es ist aber auf jeden Fall PHP, das hier streikt.
Die Headers können im gesamten Script gesetzt und geändert werden, solange sie noch nicht gesendet wurden. Dazu hält PHP die Headers in einer Liste und die ist da bezüglich der Bezeichner nicht so tolerant. Der Doppelpunkt gehört dazu.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Das Problem ist "mit welchen Begriffen suchen?"
In dem Fall aber eher nicht, wobei "autorisierte Anwender" für eine Suche zu hochtrabend sein dürfte. Bei "php Datei nur für angemeldete Nutzer anbieten" sind gleich die ersten zwei Treffer bei google zielführend. Du wußtest eher noch nicht ganz was Du willst.
Nach readfile zu suchen, wäre mir nie eingefallen.
Wie auch, wenn man noch nichts damit zu tun hatte. Das war ein Stichwort, um Dir die erste Runde bei der Suche zu ersparen.