Ich gebe den Link zu einer PDF-Datei auf meiner Webseite zum Download, wie unten
<a href="myfile.pdf">Download Brochure</a>
Das Problem ist, wenn der Benutzer dann auf diesen Link klickt
Ich möchte aber immer, dass der Benutzer zum Download Pop-Ups hat, unabhängig davon, ob "Adobe Acrobat" installiert ist oder nicht.
Bitte sag mir, wie ich das machen kann.
Statt mit der .PDF-Datei zu verknüpfen, tun Sie etwas wie
<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
dadurch wird ein benutzerdefinierter Header ausgegeben, das PDF (binäres Safe) wird geöffnet und die Daten werden an den Browser des Benutzers ausgegeben. Anschließend können sie das PDF trotz ihrer Browsereinstellungen speichern. Die pdf_server.php sollte so 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: und natürlich einige Überprüfungen der Integrität der Datei "datei" durchführen, um zu verhindern, dass Personen Ihre Dateien stehlen, z. B. keine Dateierweiterungen akzeptieren, Schrägstriche verweigern, .pdf zum Wert hinzufügen
Dies ist ein häufiges Problem, aber nur wenige wissen, dass es eine einfache HTML 5-Lösung gibt:
<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>
Dabei ist newfilename
der empfohlene Dateiname für den Benutzer zum Speichern der Datei. Oder es wird standardmäßig der Dateiname auf der Serverseite verwendet, wenn Sie ihn wie folgt leer lassen:
<a href="./directory/yourfile.pdf" download>Download the pdf</a>
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, der den Download nicht erzwungen hat, ist IE ...
Überprüfen Sie die Kompatibilität hier: http://caniuse.com/#feat=download
Keine Schleife durch jede Dateizeile ... _ Verwenden Sie readfile stattdessen schneller. Dies ist aus der PHP-Site: http://php.net/manual/de/function.readfile.php
$file = $_GET["file"];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
// 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($file));
ob_clean();
flush();
readfile($file);
exit;
}
Stellen Sie sicher, dass Sie die get-Variable desinfizieren, da jemand PHP-Dateien herunterladen könnte ...
Anstatt ein Skript PHP zu verwenden, um die Datei zu lesen und zu leeren, ist es einfacher, den Header mit .htaccess
zu überschreiben. Dadurch wird eine "schöne" URL (myfile.pdf
anstelle von download.php?myfile
) beibehalten.
<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Ich habe einen Weg gefunden, dies mit einfachem alten HTML und JavaScript/jQuery zu tun, das sich grausam verschlechtert. Getestet in IE7-10, Safari, Chrome und FF:
HTML für den Downloadlink:
<p>Thanks for downloading! If your download doesn't start shortly,
<a id="downloadLink" href="...yourpdf.pdf" target="_blank"
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>
jQuery (reiner JavaScript-Code wäre ausführlicher), der das Klicken auf den Link nach einer kurzen Verzögerung simuliert:
var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);
Um dies robuster zu gestalten, können Sie die Erkennung von HTML5-Funktionen hinzufügen. Wenn dies nicht der Fall ist, öffnen Sie mit window.open()
ein neues Fenster mit der Datei.
In HTML5 gibt es einen einfacheren Weg: Fügen Sie ein Download
-Attribut hinzu.
Es wird von den meisten modernen Browsern unterstützt.
<a download href="file.pdf">Download PDF</a>
Das ist der Schlüssel:
header("Content-Type: application/octet-stream");
Der Inhaltstyp application/x-pdf-document oder application/pdf wird während des Versendens der Datei PDF gesendet. Adobe Reader legt normalerweise den Handler für diesen MIME-Typ fest, so dass der Browser das Dokument an Adobe Reader weiterleitet, wenn einer der PDF MIME-Typen empfangen wird.
Ich weiß, dass ich sehr spät komme, um dies zu beantworten, aber ich habe einen Hack gefunden, um dies in Javascript zu tun.
function downloadFile(src){
var link=document.createElement('a');
document.body.appendChild(link);
link.href= src;
link.download = '';
link.click();
}
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:
header("Content-Type: application/octet-stream");
$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;
header("Content-Disposition: attachment; filename=" . Urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
wenn Sie die Downloadrate begrenzen müssen, verwenden Sie diesen Code !!
<?php
$local_file = 'file.Zip';
$download_file = 'name.Zip';
// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);
flush();
$file = fopen($local_file, "r");
while(!feof($file))
{
// send the current file part to the browser
print fread($file, round($download_rate * 1024));
// flush the content to the browser
flush();
// sleep one second
sleep(1);
}
fclose($file);}
else {
die('Error: The file '.$local_file.' does not exist!');
}
?>
Für weitere Informationen hier klicken
Ich habe mein Problem mit der gesamten URL der Datei PDF gelöst (anstatt nur den Dateinamen oder den Ort in href zu setzen): a href = "Domäne. com/pdf/Dateiname.pdf"
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>File Uploader</title>
<script src="../Script/angular1.3.8.js"></script>
<script src="../Script/angular-route.js"></script>
<script src="../UserScript/MyApp.js"></script>
<script src="../UserScript/FileUploder.js"></script>
<>
.percent {
position: absolute;
width: 300px;
height: 14px;
z-index: 1;
text-align: center;
font-size: 0.8em;
color: white;
}
.progress-bar {
width: 300px;
height: 14px;
border-radius: 10px;
border: 1px solid #CCC;
background-image: -webkit-gradient(linear, left top, left bottom, from(#6666cc), to(#4b4b95));
border-image: initial;
}
.uploaded {
padding: 0;
height: 14px;
border-radius: 10px;
background-image: -webkit-gradient(linear, left top, left bottom, from(#66cc00), to(#4b9500));
border-image: initial;
}
</>
</head>
<body ng-app="MyApp" ng-controller="FileUploder">
<div>
<table ="width:100%;border:solid;">
<tr>
<td>Select File</td>
<td>
<input type="file" ng-model-instant id="fileToUpload" onchange="angular.element(this).scope().setFiles(this)" />
</td>
</tr>
<tr>
<td>File Size</td>
<td>
<div ng-repeat="file in files.slice(0)">
<span ng-switch="file.size > 1024*1024">
<span ng-switch-when="true">{{file.size / 1024 / 1024 | number:2}} MB</span>
<span ng-switch-default>{{file.size / 1024 | number:2}} kB</span>
</span>
</div>
</td>
</tr>
<tr>
<td>
File Attach Status
</td>
<td>{{AttachStatus}}</td>
</tr>
<tr>
<td>
<input type="button" value="Upload" ng-click="fnUpload();" />
</td>
<td>
<input type="button" value="DownLoad" ng-click="fnDownLoad();" />
</td>
</tr>
</table>
</div>
</body>
</html>
Hier ist ein anderer Ansatz. Ich ziehe es vor, mich auf die Browserunterstützung zu verlassen oder diese auf Anwendungsebene anzusprechen, um die Webserver-Logik zu verwenden.
Wenn Sie Apache verwenden und eine .htaccess-Datei in das entsprechende Verzeichnis einfügen können, können Sie den folgenden Code verwenden. Natürlich können Sie dies auch in httpd.conf eingeben, wenn Sie darauf Zugriff haben.
<FilesMatch "\.(?i:pdf)$">
Header set Content-Disposition attachment
</FilesMatch>
Die FilesMatch-Direktive ist nur ein regulärer Ausdruck. Sie können also beliebig eingestellt werden oder Sie können andere Erweiterungen hinzufügen.
Die Header-Zeile macht dasselbe wie die erste Zeile in den obigen PHP -Skripten. Wenn Sie auch die Content-Type-Zeilen festlegen müssen, können Sie dies auf dieselbe Weise tun, aber ich habe das nicht für notwendig erachtet.