麻烦老师帮我看一下代码,为何下载的文件总是0字节?

麻烦老师帮我看一下代码,为何下载的文件总是0字节?

function download_file($filename,$allowext=array('jpg','jpeg','png','zip','rar','pdf')){

//判断文件是否存在是否可读

if (!file_exists($filename)||!is_readable($filename)) {

return false;

}

$filesize=filesize($filename);

//

header("Content-type:application/octet-stream");

header("Accept-Ranges:bytes");

header("Accept-Length:".$filesize);

header('Content-Disposition: attachment; filename=moon_'.basename($filename));



//如果请求文件在允许下载类型内,则输出文件

if (!in_array(basename($filename),$allowext)) {

return false;

}

$buffer=1024;

$sum_buffer=0;

$handle=fopen($filename,'rb');

while (!feof($handle) && $sum_buffer<$filesize) {

echo fread($handle,$buffer);

$sum_buffer+=$buffer;

}

fclose($filename);

exit;

}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
guly 2018-06-07 10:20:23

你好,如果想控制文件大小,rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。建议使用r方式打开文件

代码参考如下:

<?php
header("Content-type:text/html;charset=utf-8");
// $file_name="cookie.jpg";
$file_name="test.png";
//用以解决中文不能显示出来的问题
//$file_name=iconv("utf-8","gb2312",$file_name);
$file_path=__DIR__."/test.png";
//首先要判断给定的文件存在与否
if(!file_exists($file_path)){
    echo "没有该文件文件";
    return ;
}
$handle=fopen($file_path,"r");
$filesize=filesize($file_path);
//下载文件需要用到的头
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$filesize);
Header("Content-Disposition: attachment; filename=".$handle);
$buffer=1024;
$file_count=0;
//向浏览器返回数据
while(!feof($handle) && $file_count<$filesize){
    $file_con=fread($fp,$buffer);
    $file_count+=$buffer;
    echo $file_con;
}
fclose($handle);
?>

如果解决您的问题请采纳,祝学习愉快!

乐舞声 2018-06-04 09:35:13

fclose($filename);->fclose($hanlde);

guly 2018-06-03 10:49:56

你好,建议参考如下:

<?php
download_file('Openssl.pdf','pdf');
function download_file($filename,$allowext=array('jpg','jpeg','png','zip','rar','pdf'))
{
    //判断文件是否存在是否可读
    if (!file_exists($filename) || !is_readable($filename)) {
        return false;
    }
    $filesize = filesize($filename);
    $file_name=basename($filename);
    //
    header("Content-type:application/octet-stream");
    header("Accept-Ranges:bytes");
    header("Accept-Length:" . $filesize);
    header('Content-Disposition: attachment; filename=moon_' .$file_name);
    $handle = fread($allowext,$filesize);
        fclose($filename);
    
}
?>

解决您的问题请采纳,祝学习愉快!

  • fclose不是关闭句柄吗
    2018-06-04 15:56:55
  • guly 回复 乐舞声 #2
    你好,fclose可以关闭文件生成的句柄也可以关闭打开的文件,祝学习愉快!
    2018-06-04 16:32:54
  • 提问者 月良 #3
    老师,你的代码我看懂了,这个方法我尝试了没问题,我的问题是我想控制buffer大小来下载文件,虽然我反复检查了我的代码,但是每次下载文件都是0字节。
    2018-06-06 22:13:27
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
PHP小白零基础入门
  • 参与学习           人
  • 提交作业       626    份
  • 解答问题       4930    个

想要学好Web后端开发的中流砥柱语言,本阶段为你轻松铺就扎实的基础,从前端网页布局的搭建到后台PHP开发,助你从零基础到掌握主流开发语言。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师