download force - Obligar a abrir la ventana emergente "Guardar como ..." abrir en el enlace de texto hacer clic para PDF en HTML





link content-disposition (14)


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 .

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




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>



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 .




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




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.




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.




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



Con grandes archivos PDF, el navegador se cuelga. En Mozilla, menú HerramientasOpcionesAplicaciones , 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ú * → ComplementosAdobe Acrobat (complemento Adobe PDF para Firefox) → DESACTIVAR. ¡Ahora puedo descargar e-books!




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>



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




Intente agregar esta línea a su archivo .htaccess.

AddType application/octet-stream .pdf

Espero que funcione ya que es independiente del navegador.




<a href="file link" download target="_blank">Click here to download</a>

Funciona para mí en Firefox y Chrome.




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



Una de las opciones que debes considerar es Notable PDF
Tiene un plan gratuito a menos que esté planeando hacer una colaboración en línea en tiempo real en pdfs

Incruste el siguiente iframe en cualquier html y disfrute de los resultados:

<iframe width='1000' height='800' src='http://bit.ly/1JxrtjR' frameborder='0' allowfullscreen></iframe>






html pdf download meta-tags content-disposition