php中使用head进行二进制流输出,让用户下载PDF等附件的方法

php中使用head进行二进制流输出,让用户下载PDF等附件的方法

http://blog.csdn.net/jallin2001/article/details/6872951

在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这里居然涉及到了编码的问题,


是这样的,我要传输一个pdf附件给用户,首先是pdf文件已经存放到服务器上面了,在给文件传输过程中取名的问题,总是


在IE下面到用户端的时候,文件名是乱码,导致了文件类型无法识别,有点奇怪,文件名是UTF-8编码的,比如:“中国人.pdf”,


是从数据库中获取出来的,输出转化为$filename = iconv(‘utf-8’, ‘gbk’, $filename);,传递到用户端的时候,文件名


就正常了,这个有点稍微有点想不通。


function downloadFile( $fullPath ){ 

  


  // Must be fresh start 
  
if( headers_sent() ) 
    die(
‘Headers Sent’); 

  // Required for some browsers 
  
if(ini_get(‘zlib.output_compression’)) 
    
ini_set(‘zlib.output_compression’, ‘Off’); 

  // File Exists? 
  
if( file_exists($fullPath) ){ 
    
    
// Parse Info / Get Extension 
    
$fsize = filesize($fullPath); 
    
$path_parts = pathinfo($fullPath); 
    
$ext = strtolower($path_parts[“extension”]); 
    
    
// Determine Content Type 
    
switch ($ext) { 
      case 
“pdf”: $ctype=“application/pdf”; break; 
      case 
“exe”: $ctype=“application/octet-stream”; break; 
      case 
“zip”: $ctype=“application/zip”; break; 
      case 
“doc”: $ctype=“application/msword”; break; 
      case 
“xls”: $ctype=“application/vnd.ms-excel”; break; 
      case 
“ppt”: $ctype=“application/vnd.ms-powerpoint”; break; 
      case 
“gif”: $ctype=“image/gif”; break; 
      case 
“png”: $ctype=“image/png”; break; 
      case 
“jpeg”: 
      case 
“jpg”: $ctype=“image/jpg”; break; 
      default: 
$ctype=“application/force-download”; 
    } 

    header(“Pragma: public”); // required 
    
header(“Expires: 0”); 
    
header(“Cache-Control: must-revalidate, post-check=0, pre-check=0”); 
    
header(“Cache-Control: private”,false); // required for certain browsers 
    
header(“Content-Type: $ctype”); 
    
header(“Content-Disposition: attachment; filename=\””.basename($fullPath).“\”;” ); 
    
header(“Content-Transfer-Encoding: binary”); 
    
header(“Content-Length: “.$fsize); 
    
ob_clean(); 
    
flush(); 
    
readfile( $fullPath ); 

  } else 
    die(‘File Not Found’); 

} 


原先

原先比如文件名是UTF-8的,我想通过header(“Content-Type: $ctype;charset=UTF-8”);告诉服务器 采用UTF-8进行输出,


结果文件名还是乱码,下次关注下这个问题的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114321.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Linux内核有没有rootfs,Linux内核rootfs的初始化过程[通俗易懂]

    Linux内核有没有rootfs,Linux内核rootfs的初始化过程[通俗易懂]由于在下水平相当有限,不当之处,还望大家批评指正^_^在Linuxshell中执行mount命令,通常可以看到某个做了文件系统的磁盘分区或flash分区或内存文件系统做为所谓的根文件系统被mount到了挂载点/处。实际上内核中最初始的根文件系统,并不是来自内核外部,他是由内核自己构建出来的。为了说明这个过程,我们先说说mount的过程。系统调用sys_mount是在fs/namespace.c…

    2022年9月28日
  • 开销是有益的:AppCan 至HTML5移动创新和创业精神和健康

    开销是有益的:AppCan 至HTML5移动创新和创业精神和健康

    2022年1月4日
  • es与数据库的同步方案

    es与数据库的同步方案一、双写模式我们采取MySQL作为主要的数据存储,利用MySQL的事务特性维护数据一致性,使用ElasticSearch进行数据汇集和查询,此时es与数据库的同步方案就尤为重要。保证es与数据库的同步方案:1、首先添加商品入数据库,添加商品成功后,商品入ES,若入ES失败,将失败的商品ID放入redis的缓存队列(或MQ),且失败的商品ID入log文件(若出现redis挂掉,可从日志中取异…

    2022年5月18日
  • 基于STC89C52的自动循迹小车项目

    基于STC89C52的自动循迹小车项目摘要:本文根据对目标金属物的非接触式探测定位和移动的具体要求,以STC89C52RC单片机为控制核心,结合驱动模块、三个电感模块(LDC1000电感数字传感器)、测速模块和显示模块,设计并实现了一种自动循迹小车。该小车能在规定的具有0.6-0.9mm细铁丝标识的平面跑道上自动循迹前进,且在行进过程中能够检测到硬币并报警,同时小车的运行时间、距离等信息可在显示屏上实时显示。经过多次测试表明,该循迹小…

    2022年6月7日
  • Java代码求水仙花数

    Java代码求水仙花数这里写自定义目录标题Java代码求水仙花数Java代码求水仙花数//求水仙花数.//1.什么是水仙花数//2.水仙花数是一个三位数,且水仙花的个位,十位,百位的数字立法和等于原数。publicclassdemo_18{publicstaticvoidmain(String[]args){intnumber=0,x=0,y=0,z=0;//x表示3位数的百位上的数字,y表示三位百位上的数字,z表示三位数上个位的数字intcount

    2022年7月9日
  • java的spi机制_java编程思想第四版

    java的spi机制_java编程思想第四版What?SPI机制(ServiceProviderInterface)其实源自服务提供者框架(ServiceProviderFramework,参考【EffectiveJava】page6),是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔典型实例:jdbc的设…

    2022年10月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号