Force d'Ouvrir "Enregistrer sous..." popup ouvrir au lien texte cliquer pour PDF en HTML

j'ai des catalogues PDF de grande taille sur mon site, et j'ai besoin de les relier en téléchargement. Quand j'ai googlé, j'ai trouvé une telle chose notée ci-dessous. Il devrait ouvrir le" Enregistrer sous... " popup au lien cliquez...

 <head>
    <meta name="content-disposition" content="inline; filename=filename.pdf">
    ...

Mais ça ne fonctionne pas :/ Quand j'ai un lien vers un fichier comme ci-dessous, c'est juste des liens vers fichier et est en essayant d'ouvrir le fichier.

    <a href="filename.pdf" title="Filie Name">File name</a>

mise à jour (selon les réponses ci-dessous):

comme je vois il n'y a pas de solution 100% fiable de Cross-browser pour cela. Probablement la meilleure façon est d'utiliser l'un des services web énumérés ci-dessous, et de donner un lien de téléchargement...

129
demandé sur Peter Mortensen 2010-09-27 13:28:05
la source

17 ответов

d'une réponse à la Force d'un navigateur pour enregistrer le fichier après avoir cliqué sur le lien :

<a href="path/to/file" download>Click here to download</a>
209
répondu Ayush Gupta 2018-03-28 22:21:56
la source
<a href="file link" download target="_blank">Click here to download</a>

ça marche pour moi dans Firefox et Chrome.

72
répondu DrWaky 2014-05-10 05:05:35
la source
Les métabalises

ne sont pas un moyen fiable d'atteindre ce résultat. Généralement, vous ne devriez même pas faire cela - il devrait être laissé à l'utilisateur/agent utilisateur de décider ce que faire avec le contenu que vous fournissez. L'utilisateur peut toujours forcer son navigateur à télécharger le fichier s'il le souhaite.

si vous voulez toujours forcer le navigateur à télécharger le fichier, modifiez les en-têtes HTTP directement. Voici un exemple de code PHP:

$path = "path/to/file.pdf";
$filename = "file.pdf";
header('Content-Transfer-Encoding: binary');  // For Gecko browsers mainly
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
header('Accept-Ranges: bytes');  // Allow support for download resume
header('Content-Length: ' . filesize($path));  // File size
header('Content-Encoding: none');
header('Content-Type: application/pdf');  // Change the mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $filename);  // Make the browser display the Save As dialog
readfile($path);  // This is necessary in order to get it to actually download the file, otherwise it will be 0Kb

Notez que c'est juste une extension du protocole HTTP; certains navigateurs pourraient l'ignorer de toute façon.

33
répondu Karel Petranek 2014-04-28 21:46:12
la source

j'ai eu ce même problème et j'ai trouvé une solution qui a bien fonctionné jusqu'à présent. Vous mettez le code suivant dans votre fichier .htaccess :

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

Il est venu de Force de Télécharger un Fichier au Lieu de l'afficher dans le Navigateur .

19
répondu Tony 2018-03-28 22:24:34
la source

j'ai trouvé une solution très simple pour Firefox (fonctionne seulement avec un relatif plutôt qu'un href direct): Ajouter type="application/octet-stream" :

<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>
7
répondu User 2018-03-28 22:20:02
la source

Essayez d'ajouter cette ligne à votre .fichier htaccess.

AddType application/octet-stream .pdf

j'espère que cela fonctionnera car il est indépendant du navigateur.

5
répondu Sharad Gautam 2018-03-28 22:27:06
la source

Un vraiment simple moyen pour atteindre cet objectif, sans recourir à des sites de téléchargement ou de modification des en-têtes, etc. est de créer simplement un fichier ZIP avec le PDF à l'intérieur et le lien directement au fichier ZIP. Cela déclenchera toujours le dialogue Enregistrer/Ouvrir, et il est toujours facile pour les gens de double-cliquer les fenêtres PDF du programme associé .zip est lancé.

BTW grande question, je cherchais une réponse aussi bien, puisque la plupart des navigateurs intégrés Les plugins PDF prennent tellement de temps à afficher n'importe quoi (et vont souvent suspendre le navigateur pendant que le PDF est chargé).

4
répondu Mr. Bungle 2010-11-12 06:53:31
la source

Généralement, il se produit, parce que certains navigateurs paramètres ou plug-ins ouvrir PDF directement dans la même fenêtre comme une page Web simple.

ce qui suit pourrait vous aider. Je l'ai fait en PHP il y a quelques années. Mais actuellement Je ne travaille pas sur cette plateforme.

<?php
    if (isset($_GET['file'])) {
        $file = $_GET['file'];
        if (file_exists($file) && is_readable($file) && preg_match('/\.pdf$/',$file)) {
            header('Content-type: application/pdf');
            header("Content-Disposition: attachment; filename=\"$file\"");
            readfile($file);
        }
    }
    else {
        header("HTTP/1.0 404 Not Found");
        echo "<h1>Error 404: File Not Found: <br /><em>$file</em></h1>";
    }
?>

Enregistrer le ci-dessus comme de téléchargement.php .

enregistrez ce petit morceau comme un fichier PHP quelque part sur votre serveur et vous pouvez l'utiliser pour effectuez un téléchargement de fichier dans le navigateur, plutôt que d'afficher directement. Si vous voulez servir des fichiers autres que PDF, supprimez ou modifiez la ligne 5.

vous pouvez l'utiliser comme ceci:

ajouter le lien suivant à votre fichier HTML.

<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>

référence de: ce blog

4
répondu Ashay 2018-03-28 22:15:27
la source

un moyen très simple de le faire, si vous devez forcer le téléchargement pour un seul lien sur votre page, est d'utiliser l'attribut de téléchargement HTML5 dans le href-link.

voir: http://davidwalsh.name/download-attribute

avec cela, vous pouvez renommer le fichier que l'utilisateur va télécharger et en même temps, il force le téléchargement.

il y a eu un débat pour savoir s'il s'agit d'une bonne pratique ou non, mais dans mon cas J'ai un visualiseur incorporé pour un fichier pdf et le spectateur n'offre pas un lien de téléchargement, donc je dois fournir un séparément. Ici, je veux m'assurer que l'utilisateur ne reçoit pas le pdf ouvert dans le navigateur web, ce qui serait déroutant.

ceci n'ouvrira pas nécessairement la boîte de dialogue Enregistrer sous, mais téléchargera le lien directement vers la destination de téléchargement prédéfinie. Et bien sûr, si vous faites un site pour quelqu'un d'autre, et le besoin d'écrire manuellement les attributs de leurs liens est probablement une mauvaise idée, mais si il y a moyen d'obtenir de l'attribut dans les liens, cela peut être une solution d'éclairage.

3
répondu Julius 2015-03-02 16:05:54
la source

mettez le code ci-dessous dans votre fichier .htaccess :

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

ou vous pouvez également faire astuce par JavaScript

element.setAttribute( 'download', whatever_string_you_want);
3
répondu manish1706 2018-03-28 22:56:38
la source

je viens d'utiliser ce, mais je ne sais pas si cela fonctionne sur tous les navigateurs.

Il fonctionne dans Firefox:

<a href="myfile.pdf" download>Click to Download</a>
3
répondu NowLiveLove 2018-03-28 23:06:12
la source

une solution côté serveur est plus compatible, jusqu'à ce que l'attribut" download " soit implémenté dans tous les navigateurs.

un exemple de Python pourrait être un gestionnaire de requêtes HTTP personnalisé pour un filestore. Les liens qui pointent vers le filestore sont générés comme ceci:

http://www.myfilestore.com/filestore/13/130787e71/download_as/desiredName.pdf

voici le code:

class HTTPFilestoreHandler(SimpleHTTPRequestHandler):

    def __init__(self, fs_path, *args):
        self.fs_path = fs_path                          # Filestore path
        SimpleHTTPRequestHandler.__init__(self, *args)

    def send_head(self):
        # Overwrite SimpleHTTPRequestHandler.send_head to force download name
        path = self.path
        get_index = (path == '/')
        self.log_message("path: %s" % path)
        if '/download_as/' in path:
            p_parts = path.split('/download_as/')
            assert len(p_parts) == 2, 'Bad download link:' + path
            path, download_as = p_parts
        path = self.translate_path(path )
        f = None
        if os.path.isdir(path):
            if not self.path.endswith('/'):
                # Redirect browser - doing basically what Apache does
                self.send_response(301)
                self.send_header("Location", self.path + "/")
                self.end_headers()
                return None
            else:
                return self.list_directory(path)
        ctype = self.guess_type(path)
        try:
            f = open(path, 'rb')
        except IOError:
            self.send_error(404, "File not found")
            return None
        self.send_response(200)
        self.send_header("Content-type", ctype)
        fs = os.fstat(f.fileno())
        self.send_header("Expires", '0')
        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
        self.send_header("Cache-Control", 'must-revalidate, post-check=0, pre-check=0')
        self.send_header("Content-Transfer-Encoding", 'binary')
        if download_as:
            self.send_header("Content-Disposition", 'attachment; filename="%s"' % download_as)
        self.send_header("Content-Length", str(fs[6]))
        self.send_header("Connection", 'close')
        self.end_headers()
        return f


class HTTPFilestoreServer:

    def __init__(self, fs_path, server_address):
        def handler(*args):
            newHandler = HTTPFilestoreHandler(fs_path, *args)
            newHandler.protocol_version = "HTTP/1.0"
        self.server = BaseHTTPServer.HTTPServer(server_address, handler)

    def serve_forever(self, *args):
        self.server.serve_forever(*args)


def start_server(fs_path, ip_address, port):
    server_address = (ip_address, port)
    httpd = HTTPFilestoreServer(fs_path, server_address)

    sa = httpd.server.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()
2
répondu yucer 2018-03-28 22:58:36
la source

après le nom du fichier dans le code HTML, j'ajoute ?forcedownload=1

cela a été la façon la plus simple pour moi de déclencher une boîte de dialogue pour enregistrer ou télécharger.

0
répondu Bonnie 2015-04-23 19:19:37
la source

si vous avez un plugin dans le navigateur qui sait ouvrir un fichier PDF, il s'ouvrira directement. Comme dans le cas d'images et de contenu HTML.

donc l'approche alternative n'est pas d'envoyer votre type MIME dans la réponse. De cette façon, le navigateur ne saura jamais quel plugin doit être ouvert. Par conséquent, il vous donnera une boîte de dialogue Save/Open .

0
répondu sushil bharwani 2018-03-28 22:13:01
la source

je viens d'avoir un problème très similaire avec le problème ajouté que je devais créer des liens de téléchargement pour les fichiers à l'intérieur d'un fichier ZIP.

j'ai d'abord essayé de créer un fichier temporaire, puis j'ai fourni un lien vers le fichier temporaire, mais j'ai constaté que certains navigateurs affichaient simplement le contenu (un fichier CSV Excel) plutôt que d'offrir de télécharger. Finalement j'ai trouvé la solution en utilisant un servlet. Il fonctionne à la fois sur Tomcat et GlassFish, et je l'ai essayé sur Internet Explorer 10 et Chrome.

le servlet prend comme entrée un nom de chemin complet dans le fichier ZIP, et le nom du fichier dans le zip qui doit être téléchargé.

dans mon fichier JSP j'ai une table affichant tous les fichiers à l'intérieur du zip, avec des liens qui disent: onclick='download?zip=<%=zip%>&csv=<%=csv%>'

le code servlet est en téléchargement.java:

package myServlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.zip.*;
import java.util.*;

// Extend HttpServlet class
public class download extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        PrintWriter out = response.getWriter(); // now we can write to the client

        String filename = request.getParameter("csv");
        String zipfile = request.getParameter("zip");

        String aLine = "";

        response.setContentType("application/x-download");
        response.setHeader( "Content-Disposition", "attachment; filename=" + filename); // Force 'save-as'
        ZipFile zip = new ZipFile(zipfile);
        for (Enumeration e = zip.entries(); e.hasMoreElements();) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            if(entry.toString().equals(filename)) {
                InputStream is = zip.getInputStream(entry);
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"), 65536);
                while ((aLine = br.readLine()) != null) {
                    out.println(aLine);
                }
                is.close();
                break;
            }
        }
    }
}

pour compiler sur Tomcat vous avez besoin de classpath pour inclure tomcat\lib\servlet-api.en pot ou sur GlassFish: glassfish\lib\j2ee.jar

mais l'un et l'autre travailleront sur les deux. Vous devez également configurer votre servlet dans web.xml .

0
répondu mljm 2018-03-28 23:05:28
la source

c'est old post mais voici celui ma solution en JavaScript ce qu'en utilisant la bibliothèque jQuery.

<script>
(function($){
    var download = [];
    $('a.force-download, .force-download a').each(function(){
        // Collect info
        var $this = $(this),
            $href = $this.attr('href'),
            $split = $href.split('/'),
            $name = document.title.replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-'); // get title and clean it for the URL

        // Get filename from URL
        if($split[($split.length-1)])
        {
            $tmp = $split[($split.length-1)];
            $tmp = $tmp.split('.');
            $name = $tmp[0].replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-');
        }

        // If name already exists, put timestamp there
        if($.inArray($name, download) > -1)
        {
            $name = $name + '-' + Date.now().replace(/[\W]/gi, '-');
        }

        $(this).attr("download", $name);
        download.push($name);
    });
}(jQuery || window.jQuery))
</script>

vous avez juste besoin d'utiliser la classe force-download à l'intérieur de votre étiquette <a> et vous devrez télécharger automatiquement. Vous pouvez également l'ajouter au parent div et récupérera tous les liens à l'intérieur.

exemple:

<a href="/some/good/url/Post-Injection_Post-Surgery_Instructions.pdf" class="force-download" target="_blank">Download PDF</a>

c'est génial pour WordPress et tous les autres systèmes ou des sites web personnalisés.

0
répondu Ivijan Stefan Stipić 2018-09-26 22:53:55
la source

Avec des gros fichiers PDF le navigateur se bloque. Dans Mozilla, menu outils Options Applications , puis à côté du contenu tapez le document Adobe Acrobat. Dans la liste déroulante, sélectionnez et demandez toujours .

cela n'a pas fonctionné pour moi, donc ce qui a fonctionné était:

Menu Tools * → Add-ons Adobe Acrobat (Adobe PDF plugin for Firefox) → désactiver. Maintenant, je peux télécharger des livres électroniques!

-2
répondu Joojoo 2018-03-28 22:19:01
la source