如何在PHP中将文件作为可下载链接?

时间:2014-09-08 16:38:27

标签: php file download

我列出了带有scandir函数的目录中的文件,并在表格行中显示了这些名称。我的问题是如何使列出的文件可下载链接以及如何删除前两行不是文件名的'。'和' ..' ?

这是我的代码:

$result = scandir('test');

<table border = "1">
            <?php

            foreach($result as $value){

                echo "<tr>
                        <td>$value</td>
                      </tr>";

            }

            ?>

</table> 

3 个答案:

答案 0 :(得分:1)

将代码编辑为

$result = scandir('test');

<table border = "1">
            <?php

            foreach($result as $value){
            if($value == "." OR $value == ".."){continue;}
                echo "<tr>
                        <td><a href='download.php?value=".$value."'>".$value."</a></td>
                      </tr>";

            }

            ?>

</table> 

创建文件download.php并在其中输入以下代码:

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_GET['value']);
finfo_close($finfo);
$size = filesize($_GET['value']);
header("Content-Type: ". $mime);
header("Content-Length: ". $row['size']);
header("Content-Disposition: attachment; filename=". $_GET['value']);
echo file_get_contents($_GET['value']);
?>

这将允许您自动下载每种类型的文件,例如.html。 如果您正在寻找能够下载浏览器无法理解的文件的内容,那么@maskacovnik的回答最适合这种情况。

答案 1 :(得分:1)

如果您想强行下载,请尝试使用以下代码:

<?php
$dir = "test";
$result = scandir($dir);
?>
<table border = "1">
            <?php

            foreach($result as $value){

                if(strlen(str_replace('.','',$value)) > 0)
                {
                    echo '<tr>
                            <td><a target="_blank" href="download.php?file='.base64_encode($dir."/".$value).'">'.$value.'</a></td>
                          </tr>';
                }
            }

            ?>

</table>

还创建一个download.php文件,您可以在其中粘贴下面的强制下载代码:

<?php
    $file_url = base64_decode($_GET['file']);
    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
    readfile($file_url);
?>

答案 2 :(得分:0)

$result = scandir('test');

<table border = "1">
            <?php
            foreach($result as $value){
                if($value == ".." || $value == ".") continue;
                echo '<tr><td><a href="test\\'.$value.'">'.$value.'</a></td></tr>';
            }
            ?>
</table>