【问题标题】:how to make a download link in PHP? [closed]如何在 PHP 中制作下载链接? [关闭]
【发布时间】:2009-08-02 06:16:34
【问题描述】:

我可以使用 sql 将文件上传到数据库中,但是如何为它创建下载链接?就像当您在线下载某些内容时,会出现一个消息框,系统会询问您是要使用程序打开它还是保存它。我怎么能在 php 中做到这一点?你能给我它的代码吗?我还是菜鸟。

【问题讨论】:

  • "使用 sql 在数据库中上传文件" 您是否将文件作为 blob 存储在数据库中?还是在文件系统上?它有所作为。

标签: php download hyperlink


【解决方案1】:

将此代码放在页面上(与 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 标头最好包含在内,以便您可以指定正确的文件名;其他的只是帮助浏览器更好地处理下载,如果你愿意,可以省略。

【讨论】:

  • 如何使用它直接从数据库下载文件?用户在数据库中上传一个文件,当管理员需要检查该文件时,他当然需要下载它。我该怎么做?
  • 如果您没有足够的 PHP 和 DB 概念来使用上面的代码来完成您想要做的事情,您可能想要使用预制的数据库管理解决方案,例如 PHPMyAdmin ( phpmyadmin.net) 代替。
  • 谢谢。我将会去那里。还有一件事,当我将文件作为 blob 存储在数据库中时,我是否必须将文件名和文件大小存储在单独的列中,还是没有必要?我知道这可能看起来像一个愚蠢的问题,但我真的是一个菜鸟。还是谢谢。
  • @phpnoob 也许这会有所帮助:变量 $file_data 和 $name_of_file 从数据库中提取它们的值。为简洁起见,Dav 省略了执行此操作的代码部分。
  • @phpnoob - 您肯定需要单独存储文件名,因为它与文件的数据(存储在实际 BLOB 中的内容)无关。您可以通过简单地查看查询结果中 BLOB 数据的大小来计算文件大小。
【解决方案2】:

对此代码进行了一些编辑,以使其适用于我的情况。 - 用于 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); 
    } 
?>

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 2018-06-08
    • 2014-02-27
    • 2018-01-19
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多