使用不同的文件名下载存储的文件

44

如何让用户以不同的文件名下载文件?

例如,有一个名为“4324ffsd34.jpg”的文件。我想通过download.php让人们下载它,但使用另一个名称(比如“filetodownload.jpg”),并且不需要重命名原始文件。


你也可以使用Apache的mod_rewrite来实现此功能,而无需访问你的PHP脚本。这可能不适用于你的情况,但如果可行,可以提高性能。 - Artelius
5个回答

72

可以使用 Content-disposition 头部信息

header('Content-Disposition: attachment; filename="filetodownload.jpg"');

如果你希望提供一个默认文件名,但不希望自动下载,似乎这个方法可行。

header('Content-Disposition: filename="filetodownload.jpg"');

是的,我现在能看到了,谢谢 :),但我想我还必须使用 "readfile('original.pdf');" 来完成它。 - Utku Dalmaz
当然,设置Content-Length和Content-Type也是很好的。您可以使用filesize()获取长度,并根据扩展名编写自己的函数来执行content-type,或者使用http://uk2.php.net/fileinfo。 - David Snabel-Caunt
@RULE101 你可以使用readfile()或者fread()来完成这个任务。 - RJ Anoop

31

当然可以,只需尝试类似以下的内容:

$original_filename = '4324ffsd34.jpg';
$new_filename = 'my_new_filename_is_detailled.jpg';

// headers to send your file
header("Content-Type: application/jpeg");
header("Content-Length: " . filesize($original_filename));
header('Content-Disposition: attachment; filename="' . $new_filename . '"');

// upload the file to the user and quit
readfile($original_filename);
exit;

希望这能帮到你!


29

如果您正在使用html5,还有另一种方法。

<a href="link/to/my/file/with/a/name/i/dont/like.jpg" download="MyFile.jpg">Download</a>

干杯 :3


1
下载属性在Safari中无法工作,只能在Chrome和Firefox上使用。 - Manish Patel
10
对我来说没问题。没有人再使用Safari了。至少那些认真浏览网页的人都不用了... - Webmaster G

3
<a href="4324ffsd34.jpg" download="filetodownload">Download</a>

1
请注意,您无需指定文件扩展名,浏览器会自动添加。 - Gayan Dasanayake
1
此“下载”属性仅适用于链接到具有相同来源的资源。 - Gayan Dasanayake

3

上述内容没有问题,但我需要补充:

ob_clean();
flush();

在调用readfile之前

否则我将无法打开下载的jpg/png文件


1
非常有用。没有它,我会得到一个损坏的文件。 - viniciussss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接