我的博客

转载 2016年05月30日 16:37:18

THinkPHP1.5中文件的下载 用到的系统类库文件是Http.class.php,位于ThinkPHP/Lib/ORG/Net目录下,类名Http,其中有静态方法

static function download ($filename, $showname=”,$content=”,$expire=180);

/     @param string $filename 下载文件名(完整路径加文件的保存名字)
* @param string $showname 下载显示的文件名(想要显示的名字或者从数据库中读出的原来带中文的名字);
* @param string $content  下载的内容(默认为空,此时下载的文件就是原文件)。
* @param integer $expire  下载内容浏览器缓存时间 ,默认为空时为180秒。
*/
因为PHP保存文件名不支持中文,所以通常中文文件名保存到服务器上时换成成英文名或者生成随机名字。下载时可以利用此方法回复原文件名。
应用举例:下载时显示文件原名
/* 假设数据库里文件信息存储表为file(id,truename,savenane,user,size).
文件存在于网站项目目录下的uploads文件夹里,本网站项目名为bm,其绝对路径为:
H:/AppServ/www/bm/uploads/(  H:/AppServ/www/为文档根目录)
此时该目录下有一文件123456789.doc,(savename),原文件名为“读后感.doc”,即truename,大小为2MB.
那么要下载时服务器端得程序为:
class FileAction extends Action{
public function download(){
$uploadpath=’H:/AppServ/www/bm/uploads/’;//设置文件上传路径,服务器上的绝对路径
$id=$_GET['id'];//GET方式传到此方法中的参数id,即文件在数据库里的保存id.根据之查找文件信息。
if($id==”) //如果id为空而出错时,程序跳转到项目的Index/index页面。或可做其他处理。
{$this->redirect(‘index’,'Index’,”,APP_NAME,”,1);
}
$file=D(‘File’);//利用与表file对应的数据模型类FileModel来建立数据对象。
$result= $file->find($id);//根据id查询到文件信息
if($result==false) //如果查询不到文件信息而出错时,程序跳转到项目的Index/index页面。或可做其他处理
{$this->redirect(‘index’,'Index’,”,APP_NAME,”,1);
}
$savename=$file->savename;//文件保存名
$showname=$file->truename;//文件原名
$filename=$uploadpath.$savename;//完整文件名(路径加名字)
import(‘ORG.Net.Http’);
Http::download($filename,$showname);
}
}
然后在该文件下载的HTML模板里要下载该文件的地方加一个下载链接,调用File模块的download方法即可。记得传参数id .
如本例中:
<table>
<tr>
<td>读后感.doc</td>
<td>sunmoon</td>
<td><a href=’__APP__/File/download/id/{$id}’>下载</a></td>
<!–
其中{$id}是模板变量,代表要下载的文件在数据库中的保存id.
–>
</tr>
</table>

注:IE浏览器的下载文件名编码只有gb2312才能显示,若是不然,要不就是文件名乱码,要不就是找不到文件而无法下载。针对此种情况,我对原来的download()方法进行了一些调整,经过测试发现IE、傲游、firefox均可正常下载。
static function download ($filename, $showname=”,$content=”,$expire=180) {
if(file_exists($filename))
{ $length = filesize($filename);
}
elseif(is_file(UPLOAD_PATH.$filename))
{ $filename = UPLOAD_PATH.$filename;
$length = filesize($filename);
}
elseif($content != ”)
{ $length = strlen($content); }
else {
throw_exception($filename.L(‘_DOWN_FILE_NOT_EXIST_’)); }
if(empty($showname))
{ $showname = $filename; }
$showname = basename($showname);
if(empty($filename))
{ $type = mime_content_type($filename); }
else
{ $type = “application/octet-stream”; }
//发送Http Header信息 开始下载
header(“content-type:text/html; charset=utf-8″);
header(“Pragma: public”);
header(“Cache-control: max-age=”.$expire);
//header(‘Cache-Control: no-store, no-cache, must-revalidate’);
header(“Expires: ” . gmdate(“D, d M Y H:i:s”,time()+$expire) . “GMT”);
header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”,time()) . “GMT”);
//下面一行就是改动的地方,即用iconv(“UTF-8″,”GB2312//TRANSLIT”,$showname)系统函数转换编码为gb2312
header(“Content-Disposition: attachment; filename=”. iconv(“UTF-8″,”GB2312//TRANSLIT”,$showname)); header(“Content-Length: “.$length);
header(“Content-type: “.$type);
header(‘Content-Encoding: none’);
header(“Content-Transfer-Encoding: binary” );
if($content == ” ) { readfile($filename); }
else { echo($content); }
exit();
}

注:iconv为php系统函数库,但需要安装。若是服务器还没有这个模块安装,则需将iconv.dll下载下来后复制到windows/system32/下面,同时在php安装文件夹得ext文件夹里也复制一份。
然后在php.ini文件中将extension=php_iconv.dll前的”;”去掉,没有的话就加上extension=php_iconv.dll。然后重启服务器即可。

我的高中班主任——龚政军老师

约摸是2015年的8月19日罢,我怀着期待的心情,踏进了雅礼中学1501班的教室,首先吸引住我的眼球的,不是各路趴在桌子上刷题的学霸,也不是“自古”以来就流传着的1班的性比例,而是那一位不大看得出年龄...
  • Sakai_Masato
  • Sakai_Masato
  • 2015年12月27日 20:11
  • 884

我的2018

2017年已经进入尾声,已经许久没有认真思考过,我想,应该对自己的2017年进行总结,却发现这一年并没有做什么有意义的事情,但是我想改变这种状态。不求生活过的多姿多彩,但愿能够不虚度光阴。忽然想起一首...
  • u014622322
  • u014622322
  • 2017年12月25日 16:02
  • 63

2017的我,2018的我

转眼又是一年尽,看着朋友圈大家都在晒自己的18岁,新的一年又悄悄地来临了。回想2017,感觉日子一直平平淡淡,没有啥出奇的事,也没有给自己留下特别的回忆。每天都行走在上下班的路上,每周都在周一盼周五中...
  • u013940812
  • u013940812
  • 2018年01月01日 21:21
  • 85

我的博客模板

博客模板
  • u013990135
  • u013990135
  • 2015年12月12日 09:38
  • 303

关于《我的前半生》观后感

这几天看了几集我的前半生,看了一下网上的评价,都一致认为陈俊生是渣男,罗子君可怜。          我就不明白了,一个毕业就结婚,什么也不会的女人,天天只知道吃喝玩乐,买个包几万块,完全不体谅老公...
  • qq632015291
  • qq632015291
  • 2017年07月17日 21:25
  • 447

我的博客索引

Java学习 【基础】 ★  解析Java对象的equals()和hashCode()的使用 ★  关于Java的File.separator  ★ HashSet泛型类 ★ Linke...
  • chindroid
  • chindroid
  • 2012年07月12日 16:26
  • 4354

我的租房网

[sql] view plain copy 在CODE上查看代码片派生到我的代码片 USE MASTER   GO  EXEC XP_CMDSHELL 'MKDIR E:\HOUSE1'  ...
  • qq_36024699
  • qq_36024699
  • 2017年02月24日 15:19
  • 114

阮奇桢《我和LabVIEW》示例程序下载地址

《我和LabVIEW》示例程序下载链接不少,但不是要注册,就是既要注册又要积分。...
  • workbook
  • workbook
  • 2015年08月30日 21:30
  • 1183

我人生中的第一篇博客

嗯,今天开始了我人生中的第一篇博客。 在看数据结构,才看到链表那里,发现一个问题,上网各种百度,忽然看懂了,刚想写进有道云,但我的有道云整体结构和风格像一本有目录的书,好像不太好插进去,于是,我决定:...
  • cherrym1025
  • cherrym1025
  • 2017年06月27日 22:38
  • 94

辞职信:写给我的“藤野先生”

初入职场,遇到一位“藤野先生”是多么幸运,而遇到了又要讲辞职,是多么痛的领悟!...
  • qing_gee
  • qing_gee
  • 2017年02月15日 09:13
  • 5342
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的博客
举报原因:
原因补充:

(最多只允许输入30个字)