2009-12-01 109 views
5

鉴于:服务器上的所有上传的PDF文件都带有时间戳前缀。稍后用户可以再次下载这些文件。这些(难看的)文件名在服务器上永远不会再改变。重命名下载的PDF文件

问题:当我给出下载PDF文件的选项时,文件的名字看起来很丑,很冗长。我怎样才能把这个名字改成合理的,这样当用户下载这个文件时,名字看起来不奇怪?

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

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

你们有什么建议?

回答

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

'内容type'应该是'内容Type' ,但是。 – jensgram 2009-12-01 15:14:54

+0

@jensgram:不区分大小写。 – BalusC 2009-12-01 15:16:10

+0

@klausbyskov:请参阅BalusC下面的评论。据他说,它不会在IE浏览器上工作? – understack 2009-12-01 15:18:53

0

服务的内容的文件名中的HTTP标头的定义。看看周围的PHP page on headers(也是评论)了解更多信息。

1

您需要设置的文件名在Content-Disposition头:

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

但不幸的是,这将不是由雷蒙德团队开发的网页浏览器一定被拾起。如果你想让它在浏览器中也能正常工作,那么你需要在请求路径的最后一部分附加相同的文件名。例如:http://example.com/pdf/desiredname.pdf

+0

我认为在技术上文件名参数不应该在引号中。如果该名称不包含空格或有趣的字符,请不要使用引号。 – TRiG 2009-12-01 15:25:46

+0

@BalusC:这是有用的像http://stackoverflow.com/questions/698308/why-doesnt-content-disposition-header-work-in-ie-8这一个。谢谢。 – understack 2009-12-01 15:31:22

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

我不知道为什么。试验看看会发生什么。

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> 
+0

如果我的文件放在'myFiles'目录中,我该如何设置路径?我有点困惑。你能解释我吗? – 2014-07-30 09:08:46

+0

我发现了。我将文件名分配为'$ file ='myFiles/sample.pdf';'。它的工作方式非常魅力......感谢代码... +1 – 2014-07-30 09:35:58