添加标题不会使文件下载

时间:2013-08-08 16:59:27

标签: php

很明显,添加标题是使链接可下载的方法,但我必须做错事。我编写该文件,然后生成一些链接到它的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>

2 个答案:

答案 0 :(得分: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;
}
?>

答案 1 :(得分: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