tag - html force pdf download
Obligar a abrir la ventana emergente "Guardar como..." abrir en el enlace de texto hacer clic para PDF en HTML (16)
Tengo algunos catálogos PDF de gran tamaño en mi sitio web, y debo vincularlos como descarga. Cuando busqué en Google, encontré tal cosa que se menciona a continuación. Debería abrir la ventana emergente " Guardar como ... " al hacer clic en el enlace ...
<head>
<meta name="content-disposition" content="inline; filename=filename.pdf">
...
Pero no funciona: / Cuando hago un enlace a un archivo como el siguiente, solo enlaza al archivo y está intentando abrir el archivo.
<a href="filename.pdf" title="Filie Name">File name</a>
ACTUALIZAR (según las respuestas a continuación):
Como veo, no hay una solución de navegador cruzada 100% confiable para esto. Probablemente la mejor manera es usar uno de los servicios web que se enumeran a continuación, y dar un enlace de descarga ...
Acabo de tener un problema muy similar con el problema adicional que necesitaba para crear enlaces de descarga a archivos dentro de un archivo ZIP.
Primero intenté crear un archivo temporal, luego proporcioné un enlace al archivo temporal, pero descubrí que algunos navegadores solo mostraban los contenidos (un archivo CSV Excel) en lugar de ofrecer descargarlos. Eventualmente encontré la solución usando un servlet. Funciona tanto en Tomcat como en GlassFish, y lo probé en Internet Explorer 10 y Chrome.
El servlet toma como entrada un nombre de ruta completo al archivo ZIP, y el nombre del archivo dentro del zip que se debe descargar.
Dentro de mi archivo JSP tengo una tabla que muestra todos los archivos dentro del zip, con enlaces que dicen: onclick=''download?zip=<%=zip%>&csv=<%=csv%>''
El código del servlet está en 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;
}
}
}
}
Para compilar en Tomcat necesita el classpath para incluir tomcat / lib / servlet-api.jar o en GlassFish: glassfish / lib / j2ee.jar
Pero cualquiera funcionará en ambos. También necesita configurar su servlet en web.xml
.
Acabo de usar esto, pero no sé si funciona en todos los navegadores.
Funciona en Firefox:
<a href="myfile.pdf" download>Click to Download</a>
Con grandes archivos PDF, el navegador se cuelga. En Mozilla, menú Herramientas → Opciones → Aplicaciones , luego al lado del tipo de contenido documento de Adobe Acrobat. En el menú desplegable Acción, seleccione Preguntar siempre .
Esto no funcionó para mí, entonces lo que funcionó fue:
Herramientas de menú * → Complementos → Adobe Acrobat (complemento Adobe PDF para Firefox) → DESACTIVAR. ¡Ahora puedo descargar e-books!
De una respuesta a Forzar un navegador para guardar el archivo como después de hacer clic en el enlace :
<a href="path/to/file" download>Click here to download</a>
Después del nombre del archivo en el código HTML, agrego ?forcedownload=1
Esta ha sido la manera más simple para activar un cuadro de diálogo para guardar o descargar.
Encontré una solución muy simple para Firefox (solo funciona con un href relativo en lugar de directo): add type="application/octet-stream"
:
<a href="./file.pdf" id=''example'' type="application/octet-stream">Example</a>
Intente agregar esta línea a su archivo .htaccess.
AddType application/octet-stream .pdf
Espero que funcione ya que es independiente del navegador.
Las metaetiquetas no son una forma confiable de lograr este resultado. En general, ni siquiera debería hacer esto; debe dejarse en manos del usuario / agente de usuario para decidir qué hacer con el contenido que proporciona. El usuario siempre puede obligar a su navegador a descargar el archivo si lo desea.
Si aún desea obligar al navegador a descargar el archivo, modifique los encabezados HTTP directamente. Aquí hay un ejemplo de código 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
Tenga en cuenta que esto es solo una extensión del protocolo HTTP; algunos navegadores pueden ignorarlo de todos modos.
Por lo general, sucede porque algunas configuraciones de navegadores o complementos abren directamente el PDF en la misma ventana, como una página web simple.
Lo siguiente podría ayudarte. Lo he hecho en PHP hace unos años. Pero actualmente no estoy trabajando en esa plataforma.
<?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>";
}
?>
Guarde lo anterior como download.php .
Guarde este pequeño fragmento como un archivo PHP en algún lugar de su servidor y puede usarlo para realizar una descarga de archivos en el navegador, en lugar de mostrarlo directamente. Si desea servir archivos que no sean PDF, elimine o edite la línea 5.
Puedes usarlo así:
Agregue el siguiente enlace a su archivo HTML.
<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>
Referencia de: Este blog
Si tiene un complemento dentro del navegador que sepa cómo abrir un archivo PDF, se abrirá directamente. Como en el caso de las imágenes y el contenido HTML.
Entonces, el enfoque alternativo no es enviar su tipo MIME en la respuesta. De esta forma, el navegador nunca sabrá qué complemento debería abrirlo. Por lo tanto, le dará un cuadro de diálogo Guardar / Abrir .
Simplemente ponga el siguiente código en su archivo .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
O también puedes hacer truco con JavaScript
element.setAttribute( ''download'', whatever_string_you_want);
Tuve este mismo problema y encontré una solución que ha funcionado muy bien hasta ahora. Pon el siguiente código en tu archivo .htaccess
:
<FilesMatch "/.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Vino de Force a File para descargar en lugar de aparecer en el navegador .
Una forma realmente simple de lograr esto, sin usar sitios de descarga externos o modificar encabezados, etc., es simplemente crear un archivo ZIP con el PDF dentro y vincularlo directamente al archivo ZIP. Esto SIEMPRE activará el cuadro de diálogo Guardar / Abrir, y aún es fácil para las personas hacer doble clic en las ventanas de PDF que se lanzaron en el programa asociado con .zip.
Por cierto, también estaba buscando una respuesta, ya que la mayoría de los complementos de PDF incrustados en el navegador tardan tanto en mostrarse (y a menudo cuelgan el navegador mientras se carga el PDF).
Una forma muy sencilla de hacerlo, si necesita forzar la descarga de un solo enlace en su página, es utilizar el atributo de descarga HTML5 en el href-link.
Ver: http://davidwalsh.name/download-attribute
con esto puede cambiar el nombre del archivo que el usuario descargará y al mismo tiempo fuerza la descarga.
Ha habido un debate sobre si esto es una buena práctica o no, pero en mi caso tengo un visor integrado para un archivo pdf y el espectador no ofrece un enlace de descarga, así que tengo que proporcionar uno por separado. Aquí quiero asegurarme de que el usuario no obtenga el pdf abierto en el navegador web, lo cual sería confuso.
Esto no necesariamente abrirá el diálogo guardar como, sino que descargará el enlace directamente al destino de descarga preestablecido. Y, por supuesto, si hace un sitio para otra persona, y necesita que escriba atributos manualmente en sus enlaces, es probablemente una mala idea, pero si hay forma de obtener el atributo en los enlaces, esta puede ser una solución ligera.
Una solución del lado del servidor es más compatible, hasta que el atributo "descargar" se implemente en todos los navegadores.
Un ejemplo de Python podría ser un controlador de solicitudes HTTP personalizado para un almacén de archivos. Los enlaces que apuntan al almacén de archivos se generan así:
http://www.myfilestore.com/filestore/13/130787e71/download_as/desiredName.pdf
Aquí está el código:
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()
<a href="file link" download target="_blank">Click here to download</a>
Funciona para mí en Firefox y Chrome.