如何在PHP中建立下载链接?

时间:2009-08-02 06:16:34

标签: php download hyperlink

我可以使用sql在数据库中上传文件但是如何为它创建下载链接?比如当你在网上下载的东西然后会出现一个消息框,你会被问到是否要用程序打开它或保存它。我怎么能在PHP中这样做?你能给我代码吗?我还是个菜鸟。

2 个答案:

答案 0 :(得分:10)

将此代码放在页面上(与PHP代码一起从数据库获取信息并将其放在名称/大小/数据的变量中,然后链接到该页面。

<?php
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $name_of_file);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $size_of_file);

echo $file_data;
?>

并非所有上面列出的标头都是必需的 - 实际上,只有Content-Type标头真正才能使下载正常工作。 Content-Disposition标头最好包含,以便您可以指定正确的文件名;其他人只是帮助浏览器更好地处理下载,如果你愿意,可以省略。

答案 1 :(得分:1)

对本规范进行了一些编辑,以使其适用于我的情况。 - 适用于MP3

您可以通过调用该文件filedownload.php来调用此方法 - 将其放入您的服务器。

从类似的文件中调用它 - 从本例中的WordPress自定义字段

<a href="<?php bloginfo('url'); ?>/filedownload.php?download=<?php echo get_post_meta($post->ID, 'mymp3_value', true) ?>">MP3</a>

很简单。

<?php
    $name_of_file = $_GET["download"];

    header('Content-Description: File Transfer');
    // We'll be outputting a MP3
    header('Content-type: application/mp3');
    // It will be called file.mp3
    header('Content-Disposition: attachment; filename=' .$name_of_file);
    header('Content-Length: '.filesize($name_of_file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    // The MP3 source is in somefile.pdf
    //readfile("somefile.mp3");

    readfile_chunked($name_of_file);

    function readfile_chunked($filename) { 
        $chunksize = 1*(1024*1024); // how many bytes per chunk 
        $buffer = ''; 
        $handle = fopen($filename, 'rb');

        if ($handle === false) { 
            return false; 
        } 

        while (!feof($handle)) { 
            $buffer = fread($handle, $chunksize); 
            print $buffer; 
        } 

        return fclose($handle); 
    } 
?>