php下载文件源代码(强制任意文件格式下载)


Posted in PHP onMay 09, 2014

一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了。php下载文件其实用一个a标签就能实现,比如 <a href="web/magento-1.8.1.0.zip">magento-1.8.1.0.zip</a> 。但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用<a href="web/abc.txt">abc.txt</a> 想必也知道会发生什么了。

<?php 
/**
 * 文件下载
 *
**/
header("Content-type:text/html;charset=utf-8");
download('web/magento-1.8.1.0.zip', 'magento下载'); 
function download($file, $down_name){
 $suffix = substr($file,strrpos($file,'.')); //获取文件后缀
 $down_name = $down_name.$suffix; //新文件名,就是下载后的名字
 //判断给定的文件存在与否 
 if(!file_exists($file)){
  die("您要下载的文件已不存在,可能是被删除");
 } 
 $fp = fopen($file,"r");
 $file_size = filesize($file);
 //下载文件需要用到的头
 header("Content-type: application/octet-stream");
 header("Accept-Ranges: bytes");
 header("Accept-Length:".$file_size);
 header("Content-Disposition: attachment; filename=".$down_name);
 $buffer = 1024;
 $file_count = 0;
 //向浏览器返回数据 
 while(!feof($fp) && $file_count < $file_size){
  $file_con = fread($fp,$buffer);
  $file_count += $buffer;
  echo $file_con;
 } 
 fclose($fp);
}
?>

PHP强制性文件下载的源代码

为用户提供强制性的文件下载功能。

/********************
*@file - path to file
*/
function force_download($file)
{
if ((isset($file))&&(file_exists($file))) {
header("Content-length: ".filesize($file));
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file . '"');
readfile("$file");
} else {
echo "No file selected";
}
}

你一定会笑我"下载文件"如此简单都值得说?当然并不是想象那么简单。例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用 "Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。程序如下:

$file_name = "info_check.exe";
$file_dir = "/public/www/download/";
if (!file_exists($file_dir . $file_name)) { //检查文件是否存在
echo "文件找不到";
exit;
} else {
$file = fopen($file_dir . $file_name,"r"); // 打开文件
// 输入文件标签
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: ".filesize($file_dir . $file_name));
Header("Content-Disposition: attachment; filename=" . $file_name);
// 输出文件内容
echo fread($file,filesize($file_dir . $file_name));
fclose($file);
exit;
}

而如果文件路径是"http" 或者 "ftp" 网址的话,则源代码会有少许改变,程序如下:

$file_name = "info_check.exe";
$file_dir = "https://3water.com/";
$file = @ fopen($file_dir . $file_name,"r");
if (!$file) {
echo "文件找不到";
} else {
Header("Content-type: application/octet-stream");
Header("Content-Disposition: attachment; filename=" . $file_name);
while (!feof ($file)) {
echo fread($file,50000);
}
fclose ($file);
}

这样就可以用PHP直接输出文件了。

但,一定要注意:Header信息相当于先将文件信息高速浏览器,然后,再把浏览器上的信息下载到附件中。所以,如果在MVC模式的应用程序中,view页一定不要有任何内容,否则,view页的相关内容会随着文件的内容一同被下载,导致下载后的文件不能使用。

下面是我的程序:

 

   public function downloadAction()
    {
        if (isset($_GET['mriID']))
    {
    $this->view->mriID=(get_magic_quotes_gpc())?$_GET['mriID']:addslashes($_GET['mriID']);
    }
        if (isset($_GET['dicomID']))
    {
    $this->view->dicomID=(get_magic_quotes_gpc())?$_GET['dicomID']:addslashes($_GET['dicomID']);
    }
       if (isset($_GET['JPGID']))
    {
    $this->view->JPGID=(get_magic_quotes_gpc())?$_GET['JPGID']:addslashes($_GET['JPGID']);
    }
    $dicomfile=new dicomfile(); 
    $jpgfile=new jpgfile();
    $mri=new mri();
    if($this->view->dicomID)
    {
    $filename=$dicomfile->find($this->view->dicomID)->toArray();
    $filename=$filename[0]['filename'];
    }   
    else if($this->view->JPGID)
    {
      $filename=$jpgfile->find($this->view->JPGID)->toArray();
      $filename=$filename[0]['JPGname'];
    }
    $dir=$mri->find($this->view->mriID)->toArray();
    $dir=$dir[0]['dicom_path'];
    $file=$dir.'/'.$filename;
    if (!file_exists($file))
    {
    echo "the file does not exist!";
    exit();
    }
      $file_size=filesize($file);
           header("Content-type: application/octet-stream");
           header("Accept-Ranges: bytes");
           header("Accept-Length:". $file_size);
           header("Content-Disposition: attachment; filename=".$filename); 
           $fp=fopen($file,"r");
      if (!$fp)
    echo "can't open file!";
       $buffer_size=1024;
    $cur_pos=0;
    while (!feof($fp)&&$file_size-$cur_pos>$buffer_size)
    {
    $buffer=fread($fp,$buffer_size);
    echo $buffer;
    $cur_pos+=$buffer_size;
        }
    $buffer=fread($fp,$file_size-$cur_pos);
    echo $buffer;
    fclose($fp);  
    }

此时,download.phtml页面一定要是完全空白的。千万不要有任何内容(包括如下的固定信息:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>)否则,这些信息都将被下载到下载文件中,导致文件不能使用。

PHP 相关文章推荐
PHP5 安装方法
Jan 15 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
深入解析php中的foreach问题
Jun 30 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 #PHP
win7计划任务定时执行PHP脚本设置图解
May 09 #PHP
关于php支持分块与断点续传文件下载功能代码
May 09 #PHP
PHP程序员基本要求和必备技能
May 09 #PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 #PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 #PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 #PHP
You might like
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
JS不间断向上滚动效果代码
2013/12/25 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python编写Windows Service服务程序
2018/01/04 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
pygame实现打字游戏
2021/02/19 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
怎么快速自学python
2020/06/22 Python
python设置中文界面实例方法
2020/10/27 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
VC++笔试题
2014/10/13 面试题
写给女生的道歉信
2014/01/08 职场文书
先进个人事迹材料
2014/01/25 职场文书
网络书店创业计划书
2014/02/07 职场文书
法律意见书范本
2015/06/04 职场文书
个人售房合同协议书
2016/03/21 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
MySQL索引是啥?不懂就问
2021/07/21 MySQL
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python