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 相关文章推荐
PHP中for循环语句的几种变型
Nov 26 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
PHP实现手机归属地查询API接口实现代码
Aug 27 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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下过滤HTML代码的函数
2007/12/10 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
详解使用React制作一个模态框
2019/03/14 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Django URL参数Template反向解析
2020/11/24 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
药学专业大学生自荐信
2013/09/28 职场文书
小学毕业寄语大全
2014/04/03 职场文书
贷款委托书怎么写
2014/08/02 职场文书
会计系毕业求职信
2014/08/07 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python