使用php下载图片文件,但是下载的是整个php文件?

<?php
$fileName = 'upload/1.png';
$fileName = iconv('utf-8', 'gb2312', $fileName);
$fp = fopen($fileName, 'r+');
if(!file_exists($fileName)){
    echo 'file not';
    exit();
}
$file_size = filesize($fileName);
// 返回文件
Header('Content-type: application/octet-stream');
// 告诉客户端浏览器返回的文件大小是按照字节进行计算
Header('Accept-Ranges: bytes');
// 返回文件的大小
Header('Accept-Length:'.$file_size);
// 弹出客户端的对话框,显示对应的文件名
Header('Content-Disposition: attachment; filename='.$filename);
// 防止服务器压力过大,分段读取
$buffer = 1024;
while (!feof($fp)) {
    $file_data = fread($fp, length);
    echo $file_data;
}
fclose($fp);

这段代码执行好,浏览器弹出的是下载当前php文件的框?
图片描述

不知是什么原因造成的?

阅读 2.7k
2 个回答

$filename 文件名使用错误,上边定义的是 $fileName
还有 length 就没有定义,应该使用 $buffer 变量
修改后如下

$fileName = 'upload/1.png';
$fileName = iconv('utf-8', 'gb2312', $fileName);
$fp = fopen($fileName, 'r+');
if(!file_exists($fileName)){
    echo 'file not';
    exit();
}
$file_size = filesize($fileName);
// 返回文件
Header('Content-type: application/octet-stream');
// 告诉客户端浏览器返回的文件大小是按照字节进行计算
Header('Accept-Ranges: bytes');
// 返回文件的大小
Header('Accept-Length:'.$file_size);
// 弹出客户端的对话框,显示对应的文件名
Header('Content-Disposition: attachment;filename='.$fileName);
// 防止服务器压力过大,分段读取
$buffer = 1024;
while (!feof($fp)) {
    $file_data = fread($fp, $buffer);
    echo $file_data;
}
fclose($fp);

还有你这样并不能实现分段下载,如果要想实现请参考
HTTP/1.1 206 Partial Content 状态码

你这是个死循环吧。

  1. filename 变量未定义(大小写)

  2. length 是什么鬼,哪儿定义的

把这两个修复了就能正常工作了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题