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?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
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
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...
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>
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.
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.
Existe uma forma mais fácil no HTML5: adicionar um atributo Download
.
<a download href="file.pdf">Download PDF</a>
function downloadFile(src){
var link=document.createElement('a');
document.body.appendChild(link);
link.href= src;
link.download = '';
link.click();
}
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);
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.
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 "
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