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中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
Mar 15 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
PHP与Web页面交互操作实例分析
Jun 02 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 获取完整url地址
2008/12/20 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
Jquery异步提交表单代码分享
2015/03/26 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue观察模式浅析
2018/09/25 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
python爬虫超时的处理的实例
2018/12/19 Python
Numpy的简单用法小结
2019/08/28 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
python os模块在系统管理中的应用
2020/06/22 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
学校元旦晚会方案
2014/02/19 职场文书
法律进社区实施方案
2014/03/21 职场文书
企业法人代表任命书
2014/06/06 职场文书
后勤工作个人总结
2015/02/28 职场文书
唐山大地震观后感
2015/06/05 职场文书
暑期辅导班宣传单
2015/07/14 职场文书