Como fazer o arquivo PDF transferível no link HTML?

estou a dar a ligação de um ficheiro pdf na minha página web para download, como em baixo

<a href="myfile.pdf">Download Brochure</a>

o problema é quando o utilizador clica neste link então

  • Se o utilizador instalou o Adobe Acrobat, então abre o ficheiro na mesma janela do navegador no Adobe Reader.
  • Se o Acrobat Adobe não estiver instalado, então ele aparece para o Usuário para baixar o arquivo.

mas eu quero que ele sempre pop-up para o Usuário para download, independentemente de "Adobe acrobat" está instalado ou nao.

Por favor, diz-me como posso fazer isto?

Author: Rob W, 2008-12-13

12 answers

Em vez de ligar ao.Arquivo PDF, em vez de fazer algo como

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

Que emite um cabeçalho personalizado, Abre o PDF (binária segura) e imprime os dados para o navegador do usuário, então eles podem escolher para salvar o PDF, apesar de suas configurações de navegador. O servidor PDF_.php deve ser assim:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: e obviamente executar algumas verificações de sanidade na variável "file" para evitar que as pessoas roubem seus arquivos, tais como não aceitar extensões de arquivo, negar barras, adicionar .pdf to o valor

 109
Author: TravisO, 2017-03-30 18:27:02

Esta é uma questão comum, mas poucas pessoas sabem que há uma solução simples HTML 5:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

Onde newfilename é o nome de ficheiro sugerido para o utilizador gravar o ficheiro. Ou irá predefinir o nome do ficheiro no servidor se o deixar em branco, do seguinte modo:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

Compatibilidade: testei isto no Firefox 21 e no ferro, ambos funcionaram bem. Ele pode não funcionar em HTML5-navegadores incompatíveis ou desatualizados. O único navegador que testei que não forçou o download foi o IE...

Verifique compatibilidade aqui: http://caniuse.com/#feat=download

 161
Author: T_D, 2016-06-02 15:37:34

Não repitas em todas as linhas de ficheiros. Use readfile em vez disso, é mais rápido. Isto está fora do site do php.: http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
    // 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($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

Certifique-se de limpar a sua variável get como alguém poderia baixar alguns arquivos php...

 45
Author: Alex V, 2011-11-14 13:35:59

Em vez de usar um programa de PHP, para ler e descarregar o ficheiro, é mais simples reescrever o cabeçalho usando .htaccess. Isto irá manter um URL "nice" (myfile.pdf em vez de download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
 23
Author: Rob W, 2013-12-26 09:16:24
Encontrei uma forma de o fazer com HTML e JavaScript/jQuery simples e antigos que se degrada graciosamente. Testada em IE7-10, Safari, Cromo e FF:

HTML para a ligação de transferência:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

JQuery (código JavaScript puro seria mais descritivo) que simula carregar na ligação após um pequeno atraso:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

Para tornar isto mais robusto, poderá adicionar detecção de funcionalidades do HTML5 e, se não estiver lá, usar window.open() para abrir uma nova janela com o ficheiro.

 14
Author: Alex W, 2013-12-20 20:58:26

Esta é a chave:

header("Content-Type: application/octet-stream");

Content-type application/x-pdf-document or application / pdf is sent while sending PDF file. O Adobe Reader normalmente define o manipulador para este tipo MIME para que o navegador passe o documento para o Adobe Reader quando qualquer um dos tipos MIME PDF for recebido.

 5
Author: Sudden Def, 2008-12-13 07:27:19

Existe uma forma mais fácil no HTML5: adicionar um atributo Download.

É suportado pela maioria dos navegadores modernos.
<a download href="file.pdf">Download PDF</a> 
 4
Author: tawsif torabi, 2017-08-05 05:52:29
Sei que estou muito atrasado para responder a isto, mas encontrei um hacker para fazer isto em javascript.
function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}
 2
Author: Shivek Parmar, 2017-02-24 18:48:24

Tenta isto:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

O código dentro do pdf_server_with_ Path.php is:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

header("Content-Disposition: attachment; filename=" . Urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
 0
Author: Saill, 2012-10-19 22:14:50
Eis uma abordagem diferente. Eu prefiro ao invés de confiar no suporte do navegador, ou endereçá-lo na camada de aplicação, para usar a lógica do servidor web.

Se você está usando Apache, e pode colocar um .arquivo htaccess no diretório relevante você pode usar o código abaixo. Claro que podes pôr isto na esquadra.conf também, se tiver acesso a isso.

<FilesMatch "\.(?i:pdf)$">
  Header set Content-Disposition attachment
</FilesMatch>

A Directiva FilesMatch é apenas um regex para que possa ser definido tão granularmente quanto você quiser, ou você poderia adicionar em outros extensao.

A linha de cabeçalho faz a mesma coisa que a primeira linha nos scripts PHP acima. Se você precisa definir as linhas de conteúdo-Tipo também, você poderia fazê-lo da mesma maneira, mas eu não achei isso necessário.

 0
Author: Evan Donovan, 2016-11-29 16:52:53

Resolvi o meu usando o url completo do ficheiro PDF (em vez de apenas colocar o nome ou localização do ficheiro no href): a href="domain . com / pdf / nome do ficheiro.pdf "

 0
Author: Mark Allena, 2017-06-05 11:05:41

Em uma aplicação de Ruby on Rails (especialmente com algo como a gema de camarão e o plugin Prawnto Rails), você pode realizar isso um pouco mais simplesmente do que um script completo (como o exemplo PHP anterior).

No seu controlador:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

A parte renderizar :layout => false diz ao navegador para abrir o " deseja transferir este ficheiro?"prompt em vez de tentar renderizar o PDF. Então você seria capaz de ligar para o arquivo normalmente: http://mysite.com/myawesomepdf.pdf

 -1
Author: btw, 2008-12-13 07:49:25