Question

Je donne le lien d'un fichier pdf sur ma page web pour télécharger, comme ci-dessous

<a href="myfile.pdf">Download Brochure</a>

Le problème est lorsque l'utilisateur clique sur ce lien puis

  • Si l'utilisateur a installé Adobe Acrobat, il ouvre le fichier dans la même fenêtre du navigateur dans Adobe Reader.
  • Si Adobe Acrobat est pas installé il pop-up à l'utilisateur pour télécharger le fichier.

Mais je veux toujours pop-up à l'utilisateur pour le téléchargement, quel que soit « Adobe Acrobat » est installé ou non.

S'il vous plaît dites-moi comment je peux le faire?

Était-ce utile?

La solution

Au lieu de lier au fichier .PDF, au lieu de faire quelque chose comme

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

qui produit un en-tête personnalisé, ouvre le PDF (les données binaires) et imprime les données au navigateur de l'utilisateur, ils peuvent choisir d'enregistrer le PDF malgré leurs paramètres de votre navigateur. Le pdf_server.php devrait ressembler à ceci:

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: et exécuter évidemment certains contrôles sur la variable « file » pour empêcher les gens de voler vos fichiers tels que n'accepte pas les extensions de fichiers, de refuser des barres obliques, ajouter .pdf à la valeur

Autres conseils

Ceci est un problème commun, mais peu de gens savent qu'il ya une solution simple HTML 5:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

Où est le nom de fichier newfilename suggéré pour l'utilisateur d'enregistrer le fichier. Ou par défaut le nom de fichier sur le Serverside si vous le laissez vide, comme ceci:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

Compatibilité: Je l'ai testé ceci sur Firefox 21 et le fer, tous deux a bien fonctionné. Il pourrait ne pas fonctionner sur les navigateurs HTML5 incompatibles ou obsolètes. Le seul navigateur qui ne je l'ai testé pas forcer le téléchargement est IE ...

Vérifier la compatibilité ici: http://caniuse.com/#feat=download

Ne pas en boucle à travers chaque ligne de fichier . Utilisez readfile à la place, le plus rapide. Ceci est hors site php: http://php.net/manual/en/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;
}

Assurez-vous désinfectez votre variable get que quelqu'un pourrait télécharger des fichiers php ...

Au lieu d'utiliser un script PHP, à lire et à vider le fichier, il est plus propre de réécrire l'en-tête en utilisant .htaccess. Cela permet de garder une URL "agréable" (au lieu de myfile.pdf download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

J'ai trouvé un moyen de le faire avec le bon vieux HTML et JavaScript / jQuery qui se dégrade avec élégance. Testé dans IE7-10, Safari, Chrome et FF:

HTML pour le lien de téléchargement:

<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 (pur code JavaScript serait plus bavard) qui simule en cliquant sur le lien après un petit retard:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

Pour rendre plus robuste, vous pouvez ajouter des fonctionnalités HTML5 détection et si ce n'est pas là utilisez pour ouvrir une window.open() nouvelle fenêtre avec le fichier.

Ceci est la clé:

header("Content-Type: application/octet-stream");

Application Type de contenu / x-pdf-document ou application / pdf est envoyé lors de l'envoi de fichier PDF. Adobe Reader définit généralement le gestionnaire pour ce type MIME si navigateur passera le document à Adobe Reader lorsque l'un des types MIME PDF est reçu.

Il y a un moyen plus facile en HTML5: Ajouter un attribut Download.

Il est pris en charge par la plupart des navigateurs modernes.

<a download href="file.pdf">Download PDF</a> 

Je sais que je suis très tard pour répondre à cela, mais j'ai trouvé un hack pour le faire en javascript.

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}

Essayez ceci:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

Le code à l'intérieur pdf_server_with_path.php est:

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

Voici une autre approche. Je préfère plutôt que de compter sur le soutien du navigateur ou adresse ceci à la couche d'application, d'utiliser la logique du serveur web.

Si vous utilisez Apache, et peut mettre un fichier .htaccess dans le répertoire concerné, vous pouvez utiliser le code ci-dessous. Bien sûr, vous pouvez mettre cela en httpd.conf aussi bien, si vous avez accès à cela.

<FilesMatch "\.(?i:pdf)$">
  Header set Content-Disposition attachment
</FilesMatch>

La directive FilesMatch est juste une expression régulière afin qu'il puisse être défini comme granulairement que vous voulez, ou vous pouvez ajouter d'autres extensions.

La ligne d'en-tête fait la même chose que la première ligne dans les scripts PHP ci-dessus. Si vous devez définir les lignes Content-Type ainsi, vous pouvez le faire de la même manière, mais je n'ai trouvé que nécessaire.

Je le mien résolu en utilisant l'ensemble url du fichier PDF (Au lieu de simplement mettre le nom du fichier ou l'emplacement à href):     a href = "domaine. com / pdf / filename.pdf"

si vous avez besoin de limiter le taux de téléchargement, utilisez ce 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!');
}

?>

Pour plus d'informations cliquez ici

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

Dans une application Ruby on Rails (en particulier avec quelque chose comme la pierre précieuse Prawn et le plugin Rails Prawnto), vous pouvez accomplir cela un peu plus simple qu'un complet sur le script (comme l'exemple précédent PHP).

Dans votre contrôleur:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

Le rendu: layout => false partie indique au navigateur d'ouvrir le « Voulez-vous télécharger ce fichier? » invite au lieu d'essayer de rendre le PDF. Ensuite, vous seriez en mesure de créer un lien vers le fichier normalement: http://mysite.com/myawesomepdf.pdf

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top