【发布时间】:2009-08-02 06:16:34
【问题描述】:
我可以使用 sql 将文件上传到数据库中,但是如何为它创建下载链接?就像当您在线下载某些内容时,会出现一个消息框,系统会询问您是要使用程序打开它还是保存它。我怎么能在 php 中做到这一点?你能给我它的代码吗?我还是菜鸟。
【问题讨论】:
-
"使用 sql 在数据库中上传文件" 您是否将文件作为 blob 存储在数据库中?还是在文件系统上?它有所作为。
我可以使用 sql 将文件上传到数据库中,但是如何为它创建下载链接?就像当您在线下载某些内容时,会出现一个消息框,系统会询问您是要使用程序打开它还是保存它。我怎么能在 php 中做到这一点?你能给我它的代码吗?我还是菜鸟。
【问题讨论】:
将此代码放在页面上(与 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 标头最好包含在内,以便您可以指定正确的文件名;其他的只是帮助浏览器更好地处理下载,如果你愿意,可以省略。
【讨论】:
对此代码进行了一些编辑,以使其适用于我的情况。 - 用于 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);
}
?>
【讨论】: