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 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
php+mysql事务rollback&amp;commit示例
Feb 08 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
一个比较不错的PHP日历类分享
Nov 18 PHP
php生成html文件方法总结
Dec 01 PHP
PHP魔术方法的使用示例
Jun 23 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
php实现和c#一致的DES加密解密实例
Jul 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
第七节--类的静态成员
2006/11/16 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
详解vue 命名视图
2019/08/14 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Pygame的程序开始示例代码
2020/05/07 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
场地使用证明模板
2014/10/25 职场文书
专职安全员岗位职责
2015/04/11 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android