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?

Foi útil?

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.

scroll top