本文参考:http://www.laruence.com/2012/05/02/2613.html;http://www.52tzj.com/<?php
class="php" name="code"> $file = "/tmp/中文名.tar.gz"; $filename = basename($file); header("Content-type: application/octet-stream"); //处理中文文件名 $ua = $_SERVER["HTTP_USER_AGENT"]; $encoded_filename = rawurlencode($filename); if (preg_match("/MSIE/", $ua)) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); } else if (preg_match("/Firefox/", $ua)) { header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"'); } else { header('Content-Disposition: attachment; filename="' . $filename . '"'); } ?虽然PHP的readfile尝试实现的尽量高效, 不占用PHP本身的内存, 但是实际上它还是需要采用MMAP(如果支持), 或者是一个固定的buffer去循环读取文件, 直接输出. 输出的时候, 如果是Apache + PHP mod, 那么还需要发送到Apache的输出缓冲区. 最后才发送给用户. 而对于Nginx + fpm如果他们分开部署的话, 那还会带来额外的网络IO. //让Xsendfile发送文件,X-Sendfile头将被Apache处理, 并且把响应的文件直接发送给Client. header("X-Sendfile: $file");
在此补充一些header知识:
函数功能:
??? 送出HTTP协议的头信息到用户浏览器。
??? header() 函数向客户端发送原始的 HTTP 报头。
函数语法:
??? header (string, replace, http_response_code)
函数返回值:整数
函数种类:网络系统
参数及说明:
??? 参数???????????????? 描述?
??? string?????????????? 必需。规定要发送的报头字符串。?
??? replace????????????? 可选。指示该报头是否替换之前的报头,或添加第二个报头。默认是 true(替换)。false(允许相同类型的多个报头)。
??? http_response_code?? 可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)
函数内容说明:
??? 标头(header)是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字符串,在标头与 HTML 文件之间尚需空一行分隔。
??? 在 PHP 中送回 HTML 资料前,需先传完所有的标头。
注意事项:
??? 传统的标头一定包含下面三种标头之一,并只能出现一次。
??? Content-Type: xxxx/yyyy
? ? location: xxxx:yyyy/zzzz
??? Status: nnn xxxxxx
??? 在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。
??? 从 PHP 4.4 之后,该函数防止一次发送多个报头。这是对头部注入攻击的保护措施。
??? 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题)。
重点注意:
??? 要提醒大家注意一点,所有头信息都必须在体内容之前,如果一旦有 任何输出了的话,header函数写的 头信息就没用了。
??? 比如,在文件最开头的<?php处,如果前面有空格或者有空行,那header函数就没用了。
??? 例如:
??????? <html>
??????? <?php
??????????? //结果出错
??????????? //“<html>”字符在调用 header() 之前已存在输出
??????????? header('Location: http://www.example.com/');
??????? ?>
??? (其实可以通过设置:output_buffer 来解决,anyway),为什么这样,可以看看HTTP协议,很简单。
使用范例:
??? 1、跳转:
??????? header('Location: http://www.example.com/');
??? 2、指定内容:
??????? header('Content-type: application/pdf');
??? 3、附件:
??????? //指定内容为附件
??????? header('Content-Disposition: attachment; filename="downloaded.pdf"');
??????? //打开文件,并输出
??????? readfile('original.pdf');
??? 范例一:本例用来重定向用户页面到PHP的官方网站。
??????? <?php
??????? Header("Location:http://www.php.net");
??????? exit;
??????? ?>
??? 范例二:欲让用户每次都能得到最新的资料,而不是Proxy或cache中的资料,可以使用下列的标头。
??????? <?php
??????? //Date in the past
??????? header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
??????? header("Cache-Control: no-cache");
??????? header("Pragma: no-cache");
??????? ?>
??? 范例三:让用户的浏览器出现找不到文件的信息(404 错误)。
??????? <?php
??????? header("Status:404 NotFound");
??????? ?>
附加知识:
??? <?php
??? header('Content-type: application/image/pjpeg');???????????????????????? //输出的类型
??? header('Content-Disposition: attachment; filename="downloaded.jpg"');??? //下载显示的名字,注意格式。
??? readfile('my.jpg');
??? //并将这个文件以前面header发送信息设定的类型输出,从而会弹出一个下载框。
??? //就是把服务器上的my.jpg下载下来,下载显示和保存的名字默认是downloaded.jpg。
??? ?>
??? 文档类型 和 服务器响应HTTP的类型:
??? 上面的这个可以在上传文件的类型中对应上,下面的差了点。(原文下面的是用来写在文件头上的,来确定该文件是什么类型。)
??? 'chm'=>'application/octet-stream',
??? 'ppt'=>'application/vnd.ms-powerpoint',
??? 'xls'=>'application/vnd.ms-excel',
??? 'doc'=>'application/msword',
??? 'exe'=>'application/octet-stream',
??? 'rar'=>'application/octet-stream',
??? 'js'=>"javascript/js",
??? 'css'=>"text/css",
??? 'hqx'=>"application/mac-binhex40",
??? 'bin'=>"application/octet-stream",
??? 'oda'=>"application/oda",
??? 'pdf'=>"application/pdf",
??? 'ai'=>"application/postsrcipt",
??? 'eps'=>"application/postsrcipt",
??? 'es'=>"application/postsrcipt",
??? 'rtf'=>"application/rtf",
??? 'mif'=>"application/x-mif",
??? 'csh'=>"application/x-csh",
??? 'dvi'=>"application/x-dvi",
??? 'hdf'=>"application/x-hdf",
??? 'nc'=>"application/x-netcdf",
??? 'cdf'=>"application/x-netcdf",
??? 'latex'=>"application/x-latex",
??? 'ts'=>"application/x-troll-ts",
??? 'src'=>"application/x-wais-source",
??? 'zip'=>"application/zip",
??? 'bcpio'=>"application/x-bcpio",
??? 'cpio'=>"application/x-cpio",
??? 'gtar'=>"application/x-gtar",
??? 'shar'=>"application/x-shar",
??? 'sv4cpio'=>"application/x-sv4cpio",
??? 'sv4crc'=>"application/x-sv4crc",
??? 'tar'=>"application/x-tar",
??? 'ustar'=>"application/x-ustar",
??? 'man'=>"application/x-troff-man",
??? 'sh'=>"application/x-sh",
??? 'tcl'=>"application/x-tcl",
??? 'tex'=>"application/x-tex",
??? 'texi'=>"application/x-texinfo",
??? 'texinfo'=>"application/x-texinfo",
??? 't'=>"application/x-troff",
??? 'tr'=>"application/x-troff",
??? 'roff'=>"application/x-troff",
??? 'shar'=>"application/x-shar",
??? 'me'=>"application/x-troll-me",
??? 'ts'=>"application/x-troll-ts",
??? 'gif'=>"image/gif",
??? 'jpeg'=>"image/pjpeg",
??? 'jpg'=>"image/pjpeg",
??? 'jpe'=>"image/pjpeg",
??? 'ras'=>"image/x-cmu-raster",
??? 'pbm'=>"image/x-portable-bitmap",
??? 'ppm'=>"image/x-portable-pixmap",
??? 'xbm'=>"image/x-xbitmap",
??? 'xwd'=>"image/x-xwindowdump",
??? 'ief'=>"image/ief",
??? 'tif'=>"image/tiff",
??? 'tiff'=>"image/tiff",
??? 'pnm'=>"image/x-portable-anymap",
??? 'pgm'=>"image/x-portable-graymap",
??? 'rgb'=>"image/x-rgb",
??? 'xpm'=>"image/x-xpixmap",
??? 'txt'=>"text/plain",
??? 'c'=>"text/plain",
??? 'cc'=>"text/plain",
??? 'h'=>"text/plain",
??? 'html'=>"text/html",
??? 'htm'=>"text/html",
??? 'htl'=>"text/html",
??? 'rtx'=>"text/richtext",
??? 'etx'=>"text/x-setext",
??? 'tsv'=>"text/tab-separated-values",
??? 'mpeg'=>"video/mpeg",
??? 'mpg'=>"video/mpeg",
??? 'mpe'=>"video/mpeg",
??? 'avi'=>"video/x-msvideo",
??? 'qt'=>"video/quicktime",
??? 'mov'=>"video/quicktime",
??? 'moov'=>"video/quicktime",
??? 'movie'=>"video/x-sgi-movie",
??? 'au'=>"audio/basic",
??? 'snd'=>"audio/basic",
??? 'wav'=>"audio/x-wav",
??? 'aif'=>"audio/x-aiff",
??? 'aiff'=>"audio/x-aiff",
??? 'aifc'=>"audio/x-aiff",
??? 'swf'=>"application/x-shockwave-flash"
??? 'myz'=>"application/myz"
????
??? ".*"="application/octet-stream"
??? ".001"="application/x-001"
??? ".301"="application/x-301"
??? ".323"="text/h323"
??? ".906"="application/x-906"
??? ".907"="drawing/907"
??? ".a11"="application/x-a11"
??? ".acp"="audio/x-mei-aac"
??? ".ai"="application/postscript"
??? ".aif"="audio/aiff"
??? ".aifc"="audio/aiff"
??? ".aiff"="audio/aiff"
??? ".anv"="application/x-anv"
??? ".asa"="text/asa"
??? ".asf"="video/x-ms-asf"
??? ".asp"="text/asp"
??? ".asx"="video/x-ms-asf"
??? ".au"="audio/basic"
??? ".avi"="video/avi"
??? ".awf"="application/vnd.adobe.workflow"
??? ".biz"="text/xml"
??? ".bmp"="application/x-bmp"
??? ".bot"="application/x-bot"
??? ".c4t"="application/x-c4t"
??? ".c90"="application/x-c90"
??? ".cal"="application/x-cals"
??? ".cat"="application/vnd.ms-pki.seccat"
??? ".cdf"="application/x-netcdf"
??? ".cdr"="application/x-cdr"
??? ".cel"="application/x-cel"
??? ".cer"="application/x-x509-ca-cert"
??? ".cg4"="application/x-g4"
??? ".cgm"="application/x-cgm"
??? ".cit"="application/x-cit"
??? ".class"="java/*"
??? ".cml"="text/xml"
??? ".cmp"="application/x-cmp"
??? ".cmx"="application/x-cmx"
??? ".cot"="application/x-cot"
??? ".crl"="application/pkix-crl"
??? ".crt"="application/x-x509-ca-cert"
??? ".csi"="application/x-csi"
??? ".css"="text/css"
??? ".cut"="application/x-cut"
??? ".dbf"="application/x-dbf"
??? ".dbm"="application/x-dbm"
??? ".dbx"="application/x-dbx"
??? ".dcd"="text/xml"
??? ".dcx"="application/x-dcx"
??? ".der"="application/x-x509-ca-cert"
??? ".dgn"="application/x-dgn"
??? ".dib"="application/x-dib"
??? ".dll"="application/x-msdownload"
??? ".doc"="application/msword"
??? ".dot"="application/msword"
??? ".drw"="application/x-drw"
??? ".dtd"="text/xml"
??? ".dwf"="Model/vnd.dwf"
??? ".dwf"="application/x-dwf"
??? ".dwg"="application/x-dwg"
??? ".dxb"="application/x-dxb"
??? ".dxf"="application/x-dxf"
??? ".edn"="application/vnd.adobe.edn"
??? ".emf"="application/x-emf"
??? ".eml"="message/rfc822"
??? ".ent"="text/xml"
??? ".epi"="application/x-epi"
??? ".eps"="application/x-ps"
??? ".eps"="application/postscript"
??? ".etd"="application/x-ebx"
??? ".exe"="application/x-msdownload"
??? ".fax"="image/fax"
??? ".fdf"="application/vnd.fdf"
??? ".fif"="application/fractals"
??? ".fo"="text/xml"
??? ".frm"="application/x-frm"
??? ".g4"="application/x-g4"
??? ".gbr"="application/x-gbr"
??? ".gcd"="application/x-gcd"
??? ".gif"="image/gif"
??? ".gl2"="application/x-gl2"
??? ".gp4"="application/x-gp4"
??? ".hgl"="application/x-hgl"
??? ".hmr"="application/x-hmr"
??? ".hpg"="application/x-hpgl"
??? ".hpl"="application/x-hpl"
??? ".hqx"="application/mac-binhex40"
??? ".hrf"="application/x-hrf"
??? ".hta"="application/hta"
??? ".htc"="text/x-component"
??? ".htm"="text/html"
??? ".html"="text/html"
??? ".htt"="text/webviewhtml"
??? ".htx"="text/html"
??? ".icb"="application/x-icb"
??? ".ico"="image/x-icon"
??? ".ico"="application/x-ico"
??? ".iff"="application/x-iff"
??? ".ig4"="application/x-g4"
??? ".igs"="application/x-igs"
??? ".iii"="application/x-iphone"
??? ".img"="application/x-img"
??? ".ins"="application/x-internet-signup"
??? ".isp"="application/x-internet-signup"
??? ".IVF"="video/x-ivf"
??? ".java"="java/*"
??? ".jfif"="image/jpeg"
??? ".jpe"="image/jpeg"
??? ".jpe"="application/x-jpe"
??? ".jpeg"="image/jpeg"
??? ".jpg"="image/jpeg"
??? ".jpg"="application/x-jpg"
??? ".js"="application/x-javascript"
??? ".jsp"="text/html"
??? ".la1"="audio/x-liquid-file"
??? ".lar"="application/x-laplayer-reg"
??? ".latex"="application/x-latex"
??? ".lavs"="audio/x-liquid-secure"
??? ".lbm"="application/x-lbm"
??? ".lmsff"="audio/x-la-lms"
??? ".ls"="application/x-javascript"
??? ".ltr"="application/x-ltr"
??? ".m1v"="video/x-mpeg"
??? ".m2v"="video/x-mpeg"
??? ".m3u"="audio/mpegurl"
??? ".m4e"="video/mpeg4"
??? ".mac"="application/x-mac"
??? ".man"="application/x-troff-man"
??? ".math"="text/xml"
??? ".mdb"="application/msaccess"
??? ".mdb"="application/x-mdb"
??? ".mfp"="application/x-shockwave-flash"
??? ".mht"="message/rfc822"
??? ".mhtml"="message/rfc822"
??? ".mi"="application/x-mi"
??? ".mid"="audio/mid"
??? ".midi"="audio/mid"
??? ".mil"="application/x-mil"
??? ".mml"="text/xml"
??? ".mnd"="audio/x-musicnet-download"
??? ".mns"="audio/x-musicnet-stream"
??? ".mocha"="application/x-javascript"
??? ".movie"="video/x-sgi-movie"
??? ".mp1"="audio/mp1"
??? ".mp2"="audio/mp2"
??? ".mp2v"="video/mpeg"
??? ".mp3"="audio/mp3"
??? ".mp4"="video/mpeg4"
??? ".mpa"="video/x-mpg"
??? ".mpd"="application/vnd.ms-project"
??? ".mpe"="video/x-mpeg"
??? ".mpeg"="video/mpg"
??? ".mpg"="video/mpg"
??? ".mpga"="audio/rn-mpeg"
??? ".mpp"="application/vnd.ms-project"
??? ".mps"="video/x-mpeg"
??? ".mpt"="application/vnd.ms-project"
??? ".mpv"="video/mpg"
??? ".mpv2"="video/mpeg"
??? ".mpw"="application/vnd.ms-project"
??? ".mpx"="application/vnd.ms-project"
??? ".mtx"="text/xml"
??? ".mxp"="application/x-mmxp"
??? ".net"="image/pnetvue"
??? ".nrf"="application/x-nrf"
??? ".nws"="message/rfc822"
??? ".odc"="text/x-ms-odc"
??? ".out"="application/x-out"
??? ".p10"="application/pkcs10"
??? ".p12"="application/x-pkcs12"
??? ".p7b"="application/x-pkcs7-certificates"
??? ".p7c"="application/pkcs7-mime"
??? ".p7m"="application/pkcs7-mime"
??? ".p7r"="application/x-pkcs7-certreqresp"
??? ".p7s"="application/pkcs7-signature"
??? ".pc5"="application/x-pc5"
??? ".pci"="application/x-pci"
??? ".pcl"="application/x-pcl"
??? ".pcx"="application/x-pcx"
??? ".pdf"="application/pdf"
??? ".pdf"="application/pdf"
??? ".pdx"="application/vnd.adobe.pdx"
??? ".pfx"="application/x-pkcs12"
??? ".pgl"="application/x-pgl"
??? ".pic"="application/x-pic"
??? ".pko"="application/vnd.ms-pki.pko"
??? ".pl"="application/x-perl"
??? ".plg"="text/html"
??? ".pls"="audio/scpls"
??? ".plt"="application/x-plt"
??? ".png"="image/png"
??? ".png"="application/x-png"
??? ".pot"="application/vnd.ms-powerpoint"
??? ".ppa"="application/vnd.ms-powerpoint"
??? ".ppm"="application/x-ppm"
??? ".pps"="application/vnd.ms-powerpoint"
??? ".ppt"="application/vnd.ms-powerpoint"
??? ".ppt"="application/x-ppt"
??? ".pr"="application/x-pr"
??? ".prf"="application/pics-rules"
??? ".prn"="application/x-prn"
??? ".prt"="application/x-prt"
??? ".ps"="application/x-ps"
??? ".ps"="application/postscript"
??? ".ptn"="application/x-ptn"
??? ".pwz"="application/vnd.ms-powerpoint"
??? ".r3t"="text/vnd.rn-realtext3d"
??? ".ra"="audio/vnd.rn-realaudio"
??? ".ram"="audio/x-pn-realaudio"
??? ".ras"="application/x-ras"
??? ".rat"="application/rat-file"
??? ".rdf"="text/xml"
??? ".rec"="application/vnd.rn-recording"
??? ".red"="application/x-red"
??? ".rgb"="application/x-rgb"
??? ".rjs"="application/vnd.rn-realsystem-rjs"
??? ".rjt"="application/vnd.rn-realsystem-rjt"
??? ".rlc"="application/x-rlc"
??? ".rle"="application/x-rle"
??? ".rm"="application/vnd.rn-realmedia"
??? ".rmf"="application/vnd.adobe.rmf"
??? ".rmi"="audio/mid"
??? ".rmj"="application/vnd.rn-realsystem-rmj"
??? ".rmm"="audio/x-pn-realaudio"
??? ".rmp"="application/vnd.rn-rn_music_package"
??? ".rms"="application/vnd.rn-realmedia-secure"
??? ".rmvb"="application/vnd.rn-realmedia-vbr"
??? ".rmx"="application/vnd.rn-realsystem-rmx"
??? ".rnx"="application/vnd.rn-realplayer"
??? ".rp"="image/vnd.rn-realpix"
??? ".rpm"="audio/x-pn-realaudio-plugin"
??? ".rsml"="application/vnd.rn-rsml"
??? ".rt"="text/vnd.rn-realtext"
??? ".rtf"="application/msword"
??? ".rtf"="application/x-rtf"
??? ".rv"="video/vnd.rn-realvideo"
??? ".sam"="application/x-sam"
??? ".sat"="application/x-sat"
??? ".sdp"="application/sdp"
??? ".sdw"="application/x-sdw"
??? ".sit"="application/x-stuffit"
??? ".slb"="application/x-slb"
??? ".sld"="application/x-sld"
??? ".slk"="drawing/x-slk"
??? ".smi"="application/smil"
??? ".smil"="application/smil"
??? ".smk"="application/x-smk"
??? ".snd"="audio/basic"
??? ".sol"="text/plain"
??? ".sor"="text/plain"
??? ".spc"="application/x-pkcs7-certificates"
??? ".spl"="application/futuresplash"
??? ".spp"="text/xml"
??? ".ssm"="application/streamingmedia"
??? ".sst"="application/vnd.ms-pki.certstore"
??? ".stl"="application/vnd.ms-pki.stl"
??? ".stm"="text/html"
??? ".sty"="application/x-sty"
??? ".svg"="text/xml"
??? ".swf"="application/x-shockwave-flash"
??? ".tdf"="application/x-tdf"
??? ".tg4"="application/x-tg4"
??? ".tga"="application/x-tga"
??? ".tif"="image/tiff"
??? ".tif"="application/x-tif"
??? ".tiff"="image/tiff"
??? ".tld"="text/xml"
??? ".top"="drawing/x-top"
??? ".torrent"="application/x-bittorrent"
??? ".tsd"="text/xml"
??? ".txt"="text/plain"
??? ".uin"="application/x-icq"
??? ".uls"="text/iuls"
??? ".vcf"="text/x-vcard"
??? ".vda"="application/x-vda"
??? ".vdx"="application/vnd.visio"
??? ".vml"="text/xml"
??? ".vpg"="application/x-vpeg005"
??? ".vsd"="application/vnd.visio"
??? ".vsd"="application/x-vsd"
??? ".vss"="application/vnd.visio"
??? ".vst"="application/vnd.visio"
??? ".vst"="application/x-vst"
??? ".vsw"="application/vnd.visio"
??? ".vsx"="application/vnd.visio"
??? ".vtx"="application/vnd.visio"
??? ".vxml"="text/xml"
??? ".wav"="audio/wav"
??? ".wax"="audio/x-ms-wax"
??? ".wb1"="application/x-wb1"
??? ".wb2"="application/x-wb2"
??? ".wb3"="application/x-wb3"
??? ".wbmp"="image/vnd.wap.wbmp"
??? ".wiz"="application/msword"
??? ".wk3"="application/x-wk3"
??? ".wk4"="application/x-wk4"
??? ".wkq"="application/x-wkq"
??? ".wks"="application/x-wks"
??? ".wm"="video/x-ms-wm"
??? ".wma"="audio/x-ms-wma"
??? ".wmd"="application/x-ms-wmd"
??? ".wmf"="application/x-wmf"
??? ".wml"="text/vnd.wap.wml"
??? ".wmv"="video/x-ms-wmv"
??? ".wmx"="video/x-ms-wmx"
??? ".wmz"="application/x-ms-wmz"
??? ".wp6"="application/x-wp6"
??? ".wpd"="application/x-wpd"
??? ".wpg"="application/x-wpg"
??? ".wpl"="application/vnd.ms-wpl"
??? ".wq1"="application/x-wq1"
??? ".wr1"="application/x-wr1"
??? ".wri"="application/x-wri"
??? ".wrk"="application/x-wrk"
??? ".ws"="application/x-ws"
??? ".ws2"="application/x-ws"
??? ".wsc"="text/scriptlet"
??? ".wsdl"="text/xml"
??? ".wvx"="video/x-ms-wvx"
??? ".xdp"="application/vnd.adobe.xdp"
??? ".xdr"="text/xml"
??? ".xfd"="application/vnd.adobe.xfd"
??? ".xfdf"="application/vnd.adobe.xfdf"
??? ".xhtml"="text/html"
??? ".xls"="application/vnd.ms-excel"
??? ".xls"="application/x-xls"
??? ".xlw"="application/x-xlw"
??? ".xml"="text/xml"
??? ".xpl"="audio/scpls"
??? ".xq"="text/xml"
??? ".xql"="text/xml"
??? ".xquery"="text/xml"
??? ".xsd"="text/xml"
??? ".xsl"="text/xml"
??? ".xslt"="text/xml"
??? ".xwd"="application/x-xwd"
??? ".x_b"="application/x-x_b"
??? ".x_t"="application/x-x_t"
??? ".myz"="application/myz"
?