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 编写的日历
Oct 09 PHP
PHP面向对象的使用教程 简单数据库连接
Nov 25 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
php读取csv文件并输出的方法
Mar 14 PHP
9个比较实用的php代码片段
Mar 15 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
php生成二维码图片方法汇总
Dec 17 PHP
php session的应用详细介绍
Mar 22 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 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搜索文件程序分享
2015/10/30 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
python re正则表达式模块(Regular Expression)
2014/07/16 Python
python实现批量修改文件名代码
2017/09/10 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
对pandas中Series的map函数详解
2018/07/25 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python要安装在哪个盘
2020/06/15 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
绝对经典成功的大学生推荐信
2013/11/08 职场文书
财务助理岗位职责
2013/11/10 职场文书
爱心活动计划书
2014/04/26 职场文书
中文专业自荐书
2014/06/29 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
趣味运动会标语口号
2015/12/26 职场文书
Python实现天气查询软件
2021/06/07 Python
Oracle表空间与权限的深入讲解
2021/11/17 Oracle