经过多次测试,这是我想出的组合,从那以后它在我所有的项目中都有效。
处理下载请求的程序
<?php
// Do all neccessary security checks etc to make sure the user is allowed to download the file, etc..
//
$file = '/path/to/your/storage/directory' . 'the_stored_filename';
$filesize = filesize($file);
header('Content-Description: File Transfer');
header("Content-type: application/forcedownload");
header("Content-disposition: attachment; filename=\"filename_to_display.example\"");
header("Content-Transfer-Encoding: Binary");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-length: ".$filesize);
ob_clean();
flush();
readfile("$file");
exit;
编辑
上面的代码将进入它自己的文件,例如'download.php'。然后,您可以将其他页面上的下载链接更改为:
<a href="download.php?filename=<?php echo $test_name; ?>">Download File</a>
您还需要修改上面的 php 代码,使其适用于您的情况。在我刚刚给你的例子中,你会想要改变这一行:
$file = '/path/to/your/storage/directory' . 'the_stored_filename';
对此:
$file = $_get['filename'];
将在最基本的层面上工作。您可能希望在任何生产环境中盲目使用 $_get['filename'] 的值之前对其进行清理。
如果您想在用户请求下载的同一页面中显示下载内容,请查看我对这篇文章的回答:Dowloading multiple PDF files from javascript