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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu防火墙常用命令

    ubuntu防火墙常用命令ubuntu 防火墙常用命令

    2025年11月3日
    2
  • offsetWidth、clientWidth、width、scrollWidth区别及获取

    offsetWidth、clientWidth、width、scrollWidth区别及获取<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>offsetWidth、clientWidth、width、scrollWidth区别及获取</title><style

    2022年7月22日
    12
  • dnslog

    0x00前言我们在盲注的时候,会非常的繁杂,发起大量的请求容易被禁ip。爆数据的时候也比较慢,所以我们需要用到dnslog盲注。0x01dnslog盲注dnslog盲注条件:dnslog&#160

    2021年12月11日
    89
  • 数据库的三大范式[通俗易懂]

    数据库的三大范式[通俗易懂]当你应聘后端岗位的时候,数据库的知识必不可少,今天给大家分享一下数据库三大范式的通俗理解第一范式:无重复的列第二范式:属性完全依赖于主键第三范式:属性不依赖于其他非主属性总结:第一范式(1NF)原子性:保证数据不可再分第二范式(2NF)前提:满足第一范式每张表只描述一件事情,就是主键对应着所有信息第三范式(3NF)前提:满足第一和第二范式第三范式需要保证表中的数据和主键直接相关,而不是间接相关注意:阿里巴巴要求关联查询的表不得超过3张,数据库的性能更加重要,适当考虑规范性就好其实目前关系数据库有六种范式:

    2025年12月9日
    3
  • Pytest(15)pytest分布式执行用例[通俗易懂]

    Pytest(15)pytest分布式执行用例[通俗易懂]前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年8月6日
    2
  • Mybatis事务隔离级别「建议收藏」

    Mybatis事务隔离级别「建议收藏」转载:https://blog.csdn.net/qq924862077/article/details/52599961一般数据库的隔离级别有4个,由低到高依次为Readuncommitted、Readcommitted、Repeatableread、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。√:可能出现    ×:不会出现脏读不可重复读幻读说明…

    2022年10月14日
    2

发表回复

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

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