2010-04-08 26 views
30

¿Hay alguna manera de forzar al administrador de descargas del usuario a iniciar una descarga para .PDF en lugar de mostrar el .PDF en una nueva ventana/pestaña?¿Cómo forzar una descarga de PDF automáticamente?

+0

relacionada: http://stackoverflow.com/questions/1465573/forcing-to-download-a-file-using-php –

Respuesta

3

Debe enviar encabezados HTTP (Content-disposition) para poder hacerlo. No puedes hacer esto en el lado del cliente.

25

Conjunto Content-Disposition en su cabecera HttpResponse:

Content-Disposition = 'attachment; filename=filename.pdf' 
+0

El '; filename = 'parte [es opcional] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Syntax). –

0
<?php 
    // required for IE, otherwise Content-disposition is ignored 
    if(ini_get('zlib.output_compression')) 
     ini_set('zlib.output_compression', 'Off'); 
    } 
$reader = fopen($filename, "r"); 
$contents = fread($reader, filesize($filename)); 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($filename)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($filename)); 
    ob_end_clean(); 
    echo $contents; 
12

Esto tiene que ser hecho en el lado del servidor. No puedes hacer esto en el lado del cliente.

Cómo hacerlo depende del idioma del lado del servidor en cuestión.

PHP:

header('Content-Disposition: attachment; filename="' . $filename . '"'); 

Java:

response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

.NET:

Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

Si no hay ningún medio de cualquier código del lado del servidor, que transmite el archivo PDF, entonces usted necesita para configurarlo en el nivel del servidor web. En por ejemplo Apache HTTPD, puede colocar/expandir un archivo .htaccess en la raíz de la carpeta PDF con la siguiente entrada:

<Files *.pdf> 
    Header set Content-Disposition attachment 
</Files> 

o configurarlo a nivel mundial en httpd.conf archivo. Existe un enfoque similar para IIS con el archivo web.config.

1

solución .htaccess:

AddType application/octet-stream .pdf 
2

Sí se puede hacer en la página JSP ... Dando un enlace de descarga en una página JSP en el cual va a nueva página de guión ... y descarga el archivo PDF de la siguiente código

DownloadPage.JSP: -

<a href='downloadPdf.jsp?file=FILE.pdf' >Download PDF File</a> 

código downloadPdf.JSP: -

<%@ page import="java.util.*,java.io.*"%>    

<% 

    File f = new File ("E:/PDFfiles/Downloads/" + request.getParameter("file")); 
    response.setContentType ("application/pdf"); 
    response.setHeader ("Content-Disposition", "attachment; filename=""+request.getParameter("file")+"""); 
    String name = f.getName().substring(f.getName().lastIndexOf("/") + 1,f.getName().length()); 
    InputStream in = new FileInputStream(f); 
    ServletOutputStream outs = response.getOutputStream(); 


    int bit = 256; 
    int i = 0; 
    try { 
    while ((bit) >= 0) { 
    bit = in.read(); 
    outs.write(bit); 
        } 
     } 
     catch (IOException ioe) { 
       ioe.printStackTrace(System.out); 
      } 
    outs.flush(); 
    outs.close(); 
    in.close(); 
%> 

Fuente: http://bloggerplugnplay.blogspot.in/2012/05/how-to-create-force-download-link-for.html

+0

¡Genial! ¡Gracias! Tenga en cuenta que el nombre del archivo puede necesitar doble barra invertida \\. Tampoco me parece que el "nombre" String se use en este código – gordon613

7

Para IIS:

Poner todos los archivos que desea forzar a descargar en su propia carpeta.

Luego, en IIS vaya a esa carpeta y haga doble clic en Encabezados de respuesta HTTP.

Agregar una nueva cabecera con la siguiente información:

Nombre: content-disposition

Valor: apego

Todos los archivos de esa carpeta, cuando se accede, debe impulsar el diálogo Guardar como caja para el navegador apropiado.

+1

Funciona muy bien y no tiene que crear una página específicamente para forzar la descarga de archivos. – Edyn

3
<?php 
header('Content-disposition: attachment; filename=filename.pdf'); 
header('Content-type: application/pdf'); 
readfile('path/to/filename.pdf'); 
30

utilice el descarga atributo dentro de su <a> etiqueta

<a href="content/file.pdf" download > pdf link </a>
<a href="content/file.doc" download > doc link </a>

+1

esto solo funciona en Chrome. –

+1

Usado y probado en Chrome, Firefox e IE8. ¡Todo funciona! Simple y fácil. Nota: si usa 'download =" filename "' ¡puede incluso cambiar el nombre de la descarga! – Marja

+0

Maldición ... ¡Debo corregirme! No funciona en IE. Lo probé en una máquina virtual, en la que aún no se había instalado ningún lector de PDF. En ese caso, el archivo siempre se descarga. – Marja

0

De código vb net asp encontrado en el Internet que hice esta página sencilla C# download.aspx. Puede usarlo con la url del archivo pasada como parámetro de querystring "f". (/folder/download.aspx?f=/folder1/example.pdf).

<!DOCTYPE html> 
<html> 
<head><title></title> 
<script runat="server"> 
    void Page_Load(object sender, EventArgs e) 
    { 

     String strRequest = ""; 
     try 
     { 
      strRequest = Request.QueryString["f"].ToString(); 
     } 
     catch 
     { } 

     if (strRequest.Length > 0) 
     { 
      String path = Server.MapPath(strRequest); 
      System.IO.FileInfo File = new System.IO.FileInfo(path); 
      if (File.Exists) 
      { 
       Response.Clear(); 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + File.Name); 
       Response.AddHeader("Content-Length", File.Length.ToString()); 
       Response.ContentType = "application/octet-stream"; 
       Response.WriteFile(File.FullName); 
       Response.End(); 
      }; 
     } 
    } 
</script> 
</head> 
<body></body> 
</html> 
Cuestiones relacionadas