强制打开“另存为…”popup在文本链接打开点击在HTML中的PDF
我在我的网站有一些大尺寸的pdf目录,我需要链接这些下载。 当我Googlesearch时,发现了下面这样的事情。 它应该打开“ 另存为… ”popup链接点击..
<head> <meta name="content-disposition" content="inline; filename=filename.pdf"> ...
但它不起作用:/当我链接到文件如下,它只是链接到文件,并试图打开文件。
<a href="filename.pdf" title="Filie Name">File name</a>
更新(根据下面的答案):
正如我所看到的,没有100%可靠的跨浏览器解决scheme。 可能最好的方法是使用下面列出的Web服务之一,并提供下载链接…
- http://box.net/
- http://droplr.com/
- http://getcloudapp.com/
从答案强制浏览器保存文件为单击链接后 :
<a href="path/to/file" download>Click here to download</a>
<a href="file link" download target="_blank">Click here to download</a>
它在Firefox和Chrome中适用于我。
Meta标签不是实现这一结果的可靠方法。 一般来说,你甚至不应该这样做 – 它应该留给用户/用户代理来决定你提供的内容是什么。 用户可以随时强制他们的浏览器下载文件,如果他们想。
如果您仍想强制浏览器下载文件,请直接修改HTTP头。 这是一个PHP代码示例:
$path = "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
请注意,这只是HTTP协议的扩展; 无论如何,一些浏览器可能会忽略它。
这是我偶然发现的一个非常古老的线索,所以我相信现在都已经弄清楚了。 有这个相同的问题,并find了迄今为止工作得很好的解决scheme。 您将以下代码放入.htaccess文件中:
<FilesMatch "\.(?i:pdf)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch>
一个非常简单的方法来实现这一点,而不使用外部下载网站或修改标题等是简单地创build一个ZIP文件与PDF内,直接链接到ZIP文件。 这将始终触发保存/打开对话框,人们仍然可以轻松地双击与.zip关联的程序启动的PDF窗口。
顺便说一句,我也在寻找一个答案,因为大多数浏览器embedded式PDF插件需要很长时间才能显示任何内容(并且在PDF加载时经常挂起浏览器)。
通常会发生这种情况,因为有些浏览器设置或插件可以像简单的网页一样直接在相同的窗口中打开PDF。 这可能会帮助你。 我几年前在PHP中已经做到了。 但是,目前我没有在这个平台上工作。
<?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>"; } ?>
将上面的内容保存为download.php
将这个小片段保存为服务器上某处的PHP文件,您可以使用它在浏览器中下载文件,而不是直接显示。 如果您想提供PDF以外的文件,请删除或编辑第5行。
你可以这样使用它:
将以下链接添加到您的HTML文件。
<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>
参考: 这个博客
我发现了一个非常简单的firefox解决scheme(只适用于相对而不是直接的href):add type =“application / octet-stream”
<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>
尝试添加此行到您的.htaccess文件。
AddType application/octet-stream .pdf
如果您需要强制下载页面上的单个链接,一个非常简单的方法是使用href-link中的HTML5下载属性。
请参阅: http : //davidwalsh.name/download-attribute
有了这个,你可以重命名用户将下载的文件,同时强制下载。
有一个争论,这是否是好的做法,但在我的情况下,我有一个PDF文件的embedded式查看器和查看器不提供下载链接,所以我必须单独提供一个。 在这里,我想确保用户不会在Web浏览器中打开PDF,这会令人困惑。
这不需要打开另存为对话框,而是直接将链接下载到预设的下载目的地。 当然,如果你为别人做一个网站,并且需要他们手动写入链接的属性可能是一个坏主意,但是如果有办法将属性join链接,这可能是一个轻松的解决scheme。
服务器端解决scheme更加兼容,直到在所有浏览器中实现“下载”属性。
一个python示例可能是一个文件存储的自定义HTTP请求处理程序。 指向文件存储的链接是这样生成的:
http://www.myfilestore.com/filestore/13/130787e71/download_as/desiredName.pdf
这里是代码:
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()
只需将下面的代码放入.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
或者你也可以通过JavaScript做技巧
element.setAttribute( 'download', whatever_string_you_want );
如果您在浏览器中有一个知道如何打开PDF文件的插件,它将直接打开。 就像图片和html内容一样。 所以,另一种方法是不发送你的MIMEtypes,这样浏览器永远不会知道哪个插件应该打开它。 因此它会给你一个保存打开对话框。
在HTML代码中的文件名添加后, ?forcedownload=1
这是我触发对话框保存或下载的最简单的方法。
我只是遇到了一个非常类似的问题,我需要创buildzipFile文件的下载链接。 我第一次尝试创build一个临时文件,然后提供一个临时文件的链接,但发现一些浏览器只会显示内容(CSV Excel文件),而不是提供下载。 最终我通过使用一个servletfind了解决scheme。 它在tomcat和glassfish上都可以工作,我在IE10和Chrome上试了一下。 该servlets程序将压缩文件的完整path名作为input,并且压缩文件中的文件的名称应为downlaoded。 在我的JSP文件里面,我有一个表格,显示zip文件中的所有文件,链接指出: onclick='download?zip=<%=zip%>&csv=<%=csv%>'
servlet代码在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 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; } } } }
要在tomcat上编译,你需要classpath来包含tomcat \ lib \ servlet-api.jar或者glassfish:glassfish \ lib \ j2ee.jar,但是两者都可以。 您还需要在web.xml中设置您的servlet。
与大pdf的浏览器挂在Mozilla的工具>选项>应用程序>然后旁边的内容types的Adobe Acrobat文档的行动下拉列表中,select总是问这不适合我,所以是什么工作是:
工具>附加组件> Adobe Acrobat(适用于Firefox的Adobe pdf插件)>现在禁用,我可以下载电子书!