重命名要在飞行中下载的pdf文件

时间:2009-12-01 15:09:55

标签: php file rename

鉴于:服务器上所有上传的pdf文件都以时间戳为前缀。以后用户可以再次下载这些文件。这些(丑陋的)文件名在服务器上永远不会再改变。

问题:当我提供下载PDF文件的选项时,该文件的名称看起来很丑陋和冗长。如何将此名称更改为合理的名称,以便在用户下载此文件时,名称看起来并不奇怪?

我是否需要制作副本,因为重命名原始文件不是一种选择?这不是每个可下载文件的额外开销吗?显然删除复制的文件将是另一个额外的步骤?

一旦文件在客户端完全下载,是否可以重命名文件?

你们有什么建议?

5 个答案:

答案 0 :(得分:9)

这样的事情:

<?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');
?> 

答案 1 :(得分:5)

我需要为最近的一个项目做这件事,并且对如何实施有点困惑,但在看到Klaus的回答后不久就弄明白了。进一步阐述克劳斯的回应:

1)创建一个名为“process.php”的文件。修改Klaus的代码,使其接受两个参数:原始文件名和新名称。我的process.php看起来像:

<?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)在面向用户的页面上创建一个指向处理器脚本的链接:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>

答案 2 :(得分:1)

您需要在Content-Disposition标题中设置所需的文件名:

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

但不幸的是,雷蒙德的一个团队开发的某个网络浏览器不会提到这一点。如果你想让它在该浏览器中工作,那么你需要添加与请求路径的最后部分完全相同的文件名。例如:http://example.com/pdf/desiredname.pdf

答案 3 :(得分:0)

服务内容的文件名在HTTP标头中定义。查看PHP page on headers(以及评论)以获取更多信息。

答案 4 :(得分:0)

我刚才做了类似的事情,通过php提供文件(在我的情况下,不是为了重命名它们,而是检查下载它们的人是否已登录并被允许查看这些文件)。我发现pdf下载在IE中不起作用,除非我还添加了这些标题:

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');

我不确定为什么。试验看看会发生什么。