-1

有很好的记录表明,添加标题是使链接可下载的方法,但我一定做错了什么。我编写文件,然后生成一些指向它的 HTML 链接,但文件不会下载,只会出现在浏览器中。

<?

   //unique id
   $unique = time();

   $test_name = "HTML_for_test_" . $unique . ".txt";

   //I should put the file name I want the header attached to here (?)
   header("Content-disposition: attachment;filename=$test_name");

   $test_handler = fopen($test_name, 'w') or die("no");

   fwrite($test_handler, $test);
   fclose($test_handler);

?>

<a href="<?=$test_name">Download File</a>
4

2 回答 2

0

经过多次测试,这是我想出的组合,从那以后它在我所有的项目中都有效。

处理下载请求的程序

 <?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

于 2013-08-08T17:06:07.330 回答
0

好吧,您只是在回显一个 HTML 标记 - 您应该阅读文件内容,就像在PHP Doc上建议的那样:

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
于 2013-08-08T17:01:59.213 回答