arquivo pdf Renomear para ser baixado na mosca
Pergunta
Dada: Todos os arquivos PDF carregados no servidor são prefixados com timestamps. usuário posteriormente pode baixar esses arquivos novamente. Estes (feio) nomes nunca mudaria novamente no servidor.
Pergunta: Quando eu der a opção de arquivo de download PDF, o nome do arquivo parece feio e demorado. Como posso alterar esse nome para algo sensato, para que quando o usuário downloads esse arquivo, o nome não parece estranho?
Eu preciso fazer uma cópia, uma vez que mudar o nome do arquivo original não é uma opção? Não seria sobrecarga extra para cada arquivo para download? Obviamente excluir o arquivo copiado seria mais um passo extra?
É possível mudar o nome de arquivo, uma vez arquivo é baixado completamente no lado do cliente?
O que vocês sugerem?
Solução
Algo parecido com isto:
<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
?>
Outras dicas
Eu precisava fazer isso para um projeto recente e foi um pouco confuso sobre como implementar, mas percebi isso logo depois de ver a resposta de Klaus. Para mais elaborado sobre a resposta Klaus':
1) Crie um arquivo chamado, digamos, "process.php". código de Modificar Klaus para que ele aceita dois parâmetros: o nome do arquivo original eo novo nome. Meus process.php parece com:
<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename='.$_GET['newFile']);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
2) Criar um link em sua página virada para o usuário que aponta para o script do processador:
<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>
Você precisa definir o nome do arquivo desejado no cabeçalho Content-Disposition
:
$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');
Mas, infelizmente, isso não vai ser pego por um certo webbrowser desenvolvido por uma equipe em Redmond. Se você quiser fazê-lo funcionar em que o navegador também, então você precisa anexar o mesmo nome de arquivo com a última parte do caminho pedido. Por exemplo:. http://example.com/pdf/desiredname.pdf
O nome do arquivo do conteúdo servido é definido no cabeçalhos HTTP. Olhe ao redor da href="http://php.net/manual/en/function.header.php" rel="nofollow noreferrer"> página (também os comentários) para mais informações.
Eu estava fazendo algo semelhante há um tempo atrás, servindo arquivos através do PHP (no meu caso, não renomeá-los, mas para verificar se a pessoa baixá-los foi registrado no e foi permitido ver esses arquivos). Descobri que downloads em PDF não funcionou no IE a menos que eu também acrescentou estes cabeçalhos:
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
Eu não sei por que. Experimente e veja o que acontece.