题
假设:所有服务器上上传PDF文件的前缀为时间戳。以后用户可以再次下载这些文件。这些(丑陋)的文件名将永远不会对服务器再次发生变化。
问:当我给下载PDF文件的选项,文件名长相丑陋而漫长。我怎样才能改变这个名字的东西明智的,这样,当用户下载该文件,名字看起来不奇怪?
我需要做一个拷贝,因为重命名原始文件是不是一种选择?那岂不是为每个下载的文件额外的开销?显然删除复制的文件将是另一个额外的步骤
是否有可能一旦文件完全在客户端下载到重命名文件?
你们有什么建议?
解决方案
像这样:
<?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');
?>
其他提示
我需要为最近的一个项目做到这一点,是关于如何实现有点困惑,但看到克劳斯的回答后琢磨出来不久。要在Klaus的响应进一步阐述:
1)创建一个名为,比方说, “process.php” 文件。修改克劳斯的代码,以便它接受两个参数:原文件名和新名称。我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>
您需要设置所需的文件名在Content-Disposition
头:
$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');
但不幸的是,这将不会由雷蒙德团队开发的网页浏览器一定回升。如果你想获得它在该浏览器工作,以及,那么你就需要非常相同的文件名作为追加请求路径的最后一部分。例如:。http://example.com/pdf/desiredname.pdf
服务的内容的文件名中的HTTP标头中定义。看 PHP的头(也评论)页面各处以获得更多信息。
前一段时间我在做类似的东西,通过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');
我不知道为什么。实验看看会发生什么。
不隶属于 StackOverflow