4

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

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

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

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

你们有什么建议?

4

5 回答 5

10

像这样的东西:

<?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');
?> 
于 2009-12-01T15:12:36.203 回答
6

我需要为最近的一个项目执行此操作,并且对如何实施有点困惑,但在看到 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>
于 2012-10-03T21:20:46.573 回答
1

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

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

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

于 2009-12-01T15:14:13.237 回答
0

提供的内容的文件名在 HTTP 标头中定义。查看PHP 页面上的标题(也是评论)以获取更多信息。

于 2009-12-01T15:12:40.383 回答
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');

我不确定为什么。进行实验,看看会发生什么。

于 2009-12-01T15:23:53.053 回答