Forcer à ouvrir «Enregistrer sous…» popup en texte lien cliquez pour PDF en HTML

J’ai des catalogues PDF de grande taille sur mon site Web, et je dois 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 sur …

  ... 

Mais cela ne fonctionne pas: / Lorsque je crée un lien vers un fichier comme ci-dessous, il ne fait que créer des liens vers un fichier et tente d’ouvrir le fichier.

  File name 

MISE À JOUR (selon les réponses ci-dessous):

Comme je le vois, il n’existe pas de solution 100% fiable pour tous les navigateurs. Le meilleur moyen est probablement d’utiliser l’un des services Web énumérés ci-dessous et de fournir un lien de téléchargement …

  • http://box.net/
  • http://droplr.com/
  • http://getcloudapp.com/

À partir d’une réponse à Forcer un navigateur à enregistrer le fichier après avoir cliqué sur le lien :

 Click here to download 
 Click here to download 

Cela fonctionne pour moi dans Firefox et Chrome.

Les balises META ne sont pas un moyen fiable d’atteindre ce résultat. En règle générale, vous ne devriez même pas faire cela – il devrait être laissé à l’utilisateur / agent utilisateur de décider de 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 souhaitez toujours forcer le navigateur à télécharger le fichier, modifiez directement les en-têtes HTTP. Voici un exemple de code PHP:

 $path = "https://stackoverflow.com/questions/3802510/force-to-open-save-as-popup-open-at-text-link-click-for-pdf-in-html/path/to/file.pdf"; $filename = "file.pdf"; header('Content-Transfer-Encoding: binary'); // For Gecko browsers mainly header('Last-Modified: ' . gmdate('D, d MYH: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 qu’il ne s’agit que d’une extension du protocole HTTP. certains navigateurs peuvent l’ignorer de toute façon.

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 :

  ForceType application/octet-stream Header set Content-Disposition attachment  

Il est venu de forcer un fichier à télécharger au lieu de l’afficher dans le navigateur .

J’ai trouvé une solution très simple pour Firefox (ne fonctionne qu’avec un href relatif plutôt que direct): add type="application/octet-stream" :

 Example 

Un moyen très simple d’y parvenir, sans utiliser de sites de téléchargement externes ni modifier les en-têtes, est de créer simplement un fichier ZIP contenant le fichier PDF et de le lier directement au fichier ZIP. Cela déclenchera TOUJOURS la boîte de dialog Enregistrer / Ouvrir, et il est toujours facile pour les utilisateurs de double-cliquer sur les fenêtres PDF que le programme associé à .zip est lancé.

BTW great question, je cherchais également une réponse, puisque la plupart des plug-ins PDF intégrés au navigateur prennent tellement de temps à afficher quoi que ce soit (et accrocheront souvent le navigateur pendant le chargement du PDF).

En général, cela se produit car certains parameters ou plug-ins de navigateurs ouvrent directement PDF dans la même fenêtre, comme une simple page Web.

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 "

Error 404: File Not Found:
$file"; } ?>

Enregistrez le fichier ci-dessus en tant que download.php .

Enregistrez ce petit extrait sous forme de fichier PHP quelque part sur votre serveur et vous pourrez l’utiliser pour télécharger un fichier dans le navigateur, plutôt que de l’afficher directement. Si vous souhaitez diffuser des fichiers autres que PDF, supprimez ou modifiez la ligne 5.

Vous pouvez l’utiliser comme ça:

Ajoutez le lien suivant à votre fichier HTML.

 Download the cool PDF. 

Référence de: Ce blog

Essayez d’append cette ligne à votre fichier .htaccess.

 AddType application/octet-stream .pdf 

Un moyen très simple de le faire, si vous devez forcer le téléchargement pour un seul lien sur votre page, consiste à utiliser l’atsortingbut de téléchargement HTML5 dans le lien href.

Voir: http://davidwalsh.name/download-atsortingbute

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

Il y a eu un débat pour savoir si c’est une bonne pratique ou non, mais dans mon cas, j’ai un visualiseur intégré pour un fichier pdf et le visualiseur n’offre pas de lien de téléchargement, donc je dois en fournir un séparément. Ici, je veux m’assurer que l’utilisateur n’a pas ouvert le pdf dans le navigateur Web, ce qui serait déroutant.

Cela n’ouvre pas nécessairement la boîte de dialog Enregistrer sous, mais télécharge 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 que vous avez besoin d’écrire manuellement des atsortingbuts sur ses liens, c’est probablement une mauvaise idée, mais s’il existe un moyen d’obtenir l’atsortingbut dans les liens, cela peut être une solution légère.

Il suffit de mettre 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 aussi faire un tour par JavaScript

 element.setAtsortingbute( 'download', whatever_ssortingng_you_want); 

Je viens de l’utiliser, mais je ne sais pas si cela fonctionne sur tous les navigateurs.

Cela fonctionne dans Firefox:

 Click to Download 

Une solution côté serveur est plus compatible jusqu’à ce que l’atsortingbut “download” soit implémenté dans tous les navigateurs.

Un exemple Python pourrait être un gestionnaire de requêtes HTTP personnalisé pour un magasin de fichiers. Les liens qui pointent vers le magasin de fichiers 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_ssortingng(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() 

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

Cela a été le moyen le plus simple pour moi de déclencher une boîte de dialog pour enregistrer ou télécharger.

Si vous avez un plugin dans le navigateur qui sait comment ouvrir un fichier PDF, il s’ouvrira directement. Comme dans le cas des images et du contenu HTML.

L’approche alternative consiste donc à ne pas envoyer votre type MIME dans la réponse. De cette façon, le navigateur ne saura jamais quel plug-in doit l’ouvrir. Par conséquent, il vous donnera une boîte de dialog Enregistrer / Ouvrir .

Je viens d’avoir un problème très similaire avec le problème supplémentaire que j’avais besoin de créer des liens de téléchargement vers des 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 afficheraient simplement le contenu (un fichier Excel CSV) plutôt que de télécharger. Finalement, j’ai trouvé la solution en utilisant un servlet. Cela fonctionne à la fois sur Tomcat et GlassFish, et je l’ai essayé sur Internet Explorer 10 et Chrome.

Le servlet prend en entrée un nom de chemin complet pour le fichier ZIP et le nom du fichier à l’intérieur du fichier zip à télécharger.

Dans mon fichier JSP, j’ai un tableau affichant tous les fichiers contenus dans le fichier zip, avec des liens indiquant: onclick='download?zip=< %=zip%>&csv=< %=csv%>'

Le code de la servlet se trouve dans download.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 Ssortingng filename = request.getParameter("csv"); Ssortingng zipfile = request.getParameter("zip"); Ssortingng 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.ensortinges(); e.hasMoreElements();) { ZipEntry entry = (ZipEntry) e.nextElement(); if(entry.toSsortingng().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 comstackr sur Tomcat, vous avez besoin du classpath pour inclure tomcat \ lib \ servlet-api.jar ou sur GlassFish: glassfish \ lib \ j2ee.jar

Mais l’un ou l’autre travaillera sur les deux. Vous devez également définir votre servlet dans web.xml .

Avec les gros fichiers PDF, le navigateur se bloque. Dans Mozilla, menu OutilsOptionsApplications , puis en regard du type de contenu Document Adobe Acrobat. Dans la liste déroulante Action, sélectionnez Toujours demander .

Cela n’a pas fonctionné pour moi, alors ce qui a fonctionné était:

Outils de menu * → Modules complémentairesAdobe Acrobat (plug-in Adobe PDF pour Firefox) → DESACTIVER. Maintenant, je suis capable de télécharger des e-books!