Anstatt eine Verknüpfung mit der PDF-Datei herzustellen, führen Sie stattdessen Folgendes aus
<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
Dieser gibt einen benutzerdefinierten Header aus, öffnet die PDF-Datei (Binärtresor) und druckt die Daten im Browser des Benutzers aus. Anschließend können sie die PDF-Datei trotz ihrer Browsereinstellungen speichern. Die Datei pdf_server.php sollte folgendermaßen aussehen:
header("Content-Type: application/octet-stream");
$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
PS: Führen Sie offensichtlich einige Sicherheitsüberprüfungen für die Variable "Datei" durch, um zu verhindern, dass Personen Ihre Dateien stehlen, z. B. Dateierweiterungen nicht akzeptieren, Schrägstriche verweigern und dem Wert PDF hinzufügen
"Content-type: application/force-download"
ist hier nirgendwo aufgeführt: iana.org/assignments/media-types/application Es ist ein völlig gefälschter Header. Bitte machen Sie keine Header und senden Sie sie. Könnten Sie Ihre Antwort aktualisieren? Vielen Dank.fopen
.Dies ist ein häufiges Problem, aber nur wenige wissen, dass es eine einfache HTML 5-Lösung gibt:
Wo
newfilename
ist der vorgeschlagene Dateiname, unter dem der Benutzer die Datei speichern kann? Oder es wird standardmäßig der Dateiname auf der Serverseite verwendet, wenn Sie ihn leer lassen, wie folgt:Kompatibilität: Ich habe dies auf Firefox 21 und Iron getestet, beide haben gut funktioniert. Es funktioniert möglicherweise nicht mit HTML5-inkompatiblen oder veralteten Browsern. Der einzige Browser, den ich getestet habe und der den Download nicht erzwungen hat, ist IE ...
Überprüfen Sie die Kompatibilität hier: http://caniuse.com/#feat=download
quelle
Durchlaufen Sie nicht jede Dateizeile. Verwenden Sie stattdessen Readfile , es ist schneller. Dies ist von der PHP-Site: http://php.net/manual/en/function.readfile.php
Stellen Sie sicher, dass Sie Ihre get-Variable bereinigen, da jemand einige PHP-Dateien herunterladen könnte ...
quelle
Anstatt ein PHP-Skript zum Lesen und Leeren der Datei zu verwenden, ist es einfacher, den Header mit neu zu schreiben
.htaccess
. Dadurch bleibt eine "nette" URL erhalten (myfile.pdf
anstelle vondownload.php?myfile
).quelle
^\.pdf$
regulären Ausdruck.Ich habe einen Weg gefunden, dies mit einfachem altem HTML und JavaScript / jQuery zu tun, der sich elegant verschlechtert. Getestet in IE7-10, Safari, Chrome und FF:
HTML zum Download Link:
jQuery (reiner JavaScript-Code wäre ausführlicher), der das Klicken auf einen Link nach einer kleinen Verzögerung simuliert:
Um dies robuster zu machen, können Sie die HTML5-Feature-Erkennung hinzufügen. Wenn diese nicht vorhanden ist
window.open()
, können Sie ein neues Fenster mit der Datei öffnen.quelle
Das ist der Schlüssel:
Beim Senden einer PDF-Datei wird eine inhaltsbezogene Anwendung / x-pdf-document oder application / pdf gesendet. Adobe Reader legt normalerweise den Handler für diesen MIME-Typ fest, sodass der Browser das Dokument an Adobe Reader weiterleitet, wenn einer der PDF-MIME-Typen empfangen wird.
quelle
Ich weiß, dass ich sehr spät bin, um darauf zu antworten, aber ich habe einen Hack gefunden, um dies in Javascript zu tun.
quelle
Versuche dies:
<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>
Der Code in pdf_server_with_path.php lautet:
quelle
Hier ist ein anderer Ansatz. Ich bevorzuge es, mich auf die Browserunterstützung zu verlassen oder dies auf der Anwendungsebene anzusprechen, um die Webserverlogik zu verwenden.
Wenn Sie Apache verwenden und eine .htaccess-Datei in das entsprechende Verzeichnis stellen können, können Sie den folgenden Code verwenden. Natürlich können Sie dies auch in httpd.conf einfügen, wenn Sie Zugriff darauf haben.
Die FilesMatch-Direktive ist nur ein regulärer Ausdruck, sodass sie beliebig detailliert festgelegt oder in anderen Erweiterungen hinzugefügt werden kann.
Die Header-Zeile macht dasselbe wie die erste Zeile in den obigen PHP-Skripten. Wenn Sie auch die Zeilen für den Inhaltstyp festlegen müssen, können Sie dies auf die gleiche Weise tun, aber ich habe dies nicht für erforderlich befunden.
quelle
Ich habe meine mit der gesamten URL der PDF-Datei gelöst (anstatt nur den Dateinamen oder den Speicherort in href zu setzen): a href = "domain. Com / pdf / filename.pdf"
quelle
Wenn Sie die Download-Rate begrenzen müssen, verwenden Sie diesen Code!
Für weitere Informationen klicken Sie hier
quelle
quelle
In einer Ruby on Rails-Anwendung (insbesondere mit etwas wie dem Prawn Gem und dem Prawnto Rails-Plugin) können Sie dies etwas einfacher als mit einem vollständigen On-Skript (wie im vorherigen PHP-Beispiel) erreichen.
In Ihrem Controller:
Der Teil render: layout => false weist den Browser an, das Feld "Möchten Sie diese Datei herunterladen?" Zu öffnen. Eingabeaufforderung, anstatt zu versuchen, das PDF zu rendern. Dann können Sie normalerweise auf die Datei verlinken: http://mysite.com/myawesomepdf.pdf
quelle