it-swarm.com.de

Wie man ... macht PDF Datei als HTML-Link herunterladbar?

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

  • Wenn der Benutzer Adobe Acrobat installiert hat, wird die Datei in demselben Browserfenster in Adobe Reader geöffnet.
  • Wenn Adobe Acrobat nicht installiert ist, wird der Benutzer zum Herunterladen der Datei eingeblendet.

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.

112
Prashant

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

113
TravisO

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

171
T_D

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

48
Alex V

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>
24
Rob W

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.

14
Alex W

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> 
5
tawsif torabi

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.

5
Sudden Def

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();
}
3
Shivek Parmar

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);
0
Saill

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

0

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" 

0
Mark Allena
<!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>   
0
user11021789

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.

0
Evan Donovan