`

THinkPHP中文件下载

阅读更多
 

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均可正常下载。

    /**
     +----------------------------------------------------------
     * 下载文件
     * 可以指定下载显示的文件名,并自动发送相应的Header信息
     * 如果指定了content参数,则下载该参数的内容
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $filename 下载文件名
     * @param string $showname 下载显示的文件名
     * @param string $content  下载的内容
     * @param integer $expire  下载内容浏览器缓存时间
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     * @throws ThinkExecption
     +----------------------------------------------------------
     */
    static public 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('下载文件不存在!'));
  }
  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",$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。然后重启服务器即可。

 

分享到:
评论

相关推荐

    thinkphp6框架下载

    thinkphp6框架下载

    ThinkPHP官方文档.zip

    可以看我发表的博文里面有截图:包括快速入门手册(新手教程版),ThinkPHP5.0完全开发手册,ThinkPHP5路由完全指南,ThinkPHP5控制器从入门到精通,掌握ThinkPHP5.0数据库和模型 完全开发手册离线版

    ThinkPHP 官方文档史上最强合集6本

    ThinkPHP5.0完全开发手册_看云完整.pdf ThinkPHP5.1完全开发手册离线版.CHM ThinkPHP5控制器从入门到精通.pdf ThinkPHP5快速入门.pdf ThinkPHP5路由完全指南.CHM 掌握ThinkPHP5.0数据库和模型-离线版(官方).chm

    Thinkphp6完整资源包下载

    Thinkphp6.0.5完整资源包下载,内含当前版本的所有插件,不喜欢使用composer安装的同学可以带走呀!

    ThinkPHP5文件管理平台

    文件资料分类上传,可以直接拖拽上传和管理,快速查找

    ThinkPHP6.0.zip

    ThinkPHP V6 源码,直接下载解压缩就可以用,13载初心不改 - 你值得信赖的PHP框架。。

    thinkphp5.0开发手册

    thinkphp5.0开发手册...........................................................................................................................................................

    ThinkPHP3.1完全开发手册

    本文档的版权归ThinkPHP文档小组所有,本文档及其描述的内容受有关法律的版权保护,对本文档内容的任何形式的非法复制,泄露或散布,将导致相应的法律责任。3 作者和贡献者 本手册内容由ThinkPHP创始人刘晨(流年)...

    ThinkPHP开发文档合集 for v2.1

    ThinkPHP开发文档合集PDF版包括了:ThinkPHP2.1 RBAC使用和示例操作.pdf,ThinkPHP2.1 常见问题&开发技巧.pdf,ThinkPHP2.1 完全开发手册.pdf 三个官方发布的教程文件,能帮助你迅速学习和掌握ThinkPHP的开发。

    thinkphp chm chm文档 齐全

    thinkphp chm chm文档 所有thinkphp文档 最全的thinkphp文档

    ThinkPHP6.pdf

    Thinkphp6入门到实战

    ThinkPHP5快速入门

    thinkphp5.0学习手册,快速入门,官方文档手册,仅用于学习

    ThinkPHP开发文档

    ThinkPHP开发文档 解压后为pdf格式的

    thinkphp生成word文档并导出

    thinkphp把数据库内容生成word,且可以下载到本地,一个类放到指定文件夹里,另一个则是控制器,自行修改即可。

    thinkphp5开发文档

    thinkphp5开发文档

    thinkphp配置文件,

    这里是一个thinkphp配置文件,只需要修改数据库名称就可以了,

    thinkPHP删除单个文件

    运用ThinkPHP技术进行上传,上传后可对指定的文件进行物理删除和删除数据库中的指定的名称

    Elasticsearch7.14.0+thinkphp5.1后台管理索引和文档+权限管理

    Elasticsearch+thinkphp5.1后台管理索引和文档+权限管理,可查看https://blog.csdn.net/weixin_39934453/article/details/120097526

    thinkphp3.2.1 文档讲义

    thinkphp3.2.1 文档讲义, 超实用!!!

Global site tag (gtag.js) - Google Analytics