From 899ee59c73bc0304121f998dd5138131ab9e8675 Mon Sep 17 00:00:00 2001 From: Yuanuo Date: Sat, 4 Aug 2018 14:49:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DX-Sendfile=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=97=B6=E9=99=84=E4=BB=B6=E6=96=87=E4=BB=B6=E5=90=8D=E5=92=8C?= =?UTF-8?q?Content-Type=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82=201=EF=BC=8C=E9=92=88=E5=AF=B9=E5=90=84=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E7=9A=84=E9=99=84=E4=BB=B6=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E4=B8=8D=E5=90=8C=E5=A4=B4=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E3=80=82=202=EF=BC=8C=E8=A7=A3=E5=86=B3Conte?= =?UTF-8?q?nt-Type=E4=B8=BAtext/html=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/index/model/FileManage.php | 41 +++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/application/index/model/FileManage.php b/application/index/model/FileManage.php index acf92592..faa50240 100644 --- a/application/index/model/FileManage.php +++ b/application/index/model/FileManage.php @@ -877,16 +877,33 @@ class FileManage extends Model{ $filePath = '/public/uploads/' . $this->fileData["pre_name"]; } if($download){ - header('Content-Disposition: attachment; filename="' . str_replace(",","",$this->fileData["orign_name"]) . '"'); - header("Content-type: application/octet-stream"); - header('Content-Length: ' .(string)(filesize($realPath)) ); $filePath = str_replace("\\","/",$filePath); if($header == "X-Accel-Redirect"){ ob_flush(); flush(); echo "s"; } - header($header.": ".str_replace('%2F', '/', rawurlencode($filePath))); + //保证如下顺序,否则最终浏览器中得到的content-type为'text/html' + //1,写入 X-Sendfile 头信息 + $pathToFile = str_replace('%2F', '/', rawurlencode($filePath)); + header($header.": ".$pathToFile); + //2,写入Content-Type头信息 + $mime_type = self::getMimetypeOnly($realPath); + header('Content-Type: '.$mime_type); + //3,写入正确的附件文件名头信息 + $orign_fname = $this->fileData["orign_name"]; + $ua = $_SERVER["HTTP_USER_AGENT"]; // 处理不同浏览器的兼容性 + if (preg_match("/Firefox/", $ua)) { + $encoded_filename = rawurlencode($orign_fname); + header("Content-Disposition: attachment; filename*=\"utf8''" . $encoded_filename . '"'); + } else if (preg_match("/MSIE/", $ua) || preg_match("/Edge/", $ua) || preg_match("/rv:/", $ua)) { + $encoded_filename = rawurlencode($orign_fname); + header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); + } else { + // for Chrome,Safari etc. + header('Content-Disposition: attachment;filename="'. $orign_fname .'";filename*=utf-8'."''". $orign_fname); + } + exit; }else{ $filePath = str_replace("\\","/",$filePath); header('Content-Type: '.self::getMimetype($realPath)); @@ -918,7 +935,8 @@ class FileManage extends Model{ header('Cache-control: private'); header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($filePath)); - header('Content-Disposition: filename='.str_replace(",","",$this->fileData["orign_name"])); + $encoded_fname = rawurlencode($this->fileData["orign_name"]); + header('Content-Disposition: attachment;filename="'.$encoded_fname.'";filename*=utf-8'."''".$encoded_fname); ob_flush(); flush(); } @@ -950,7 +968,8 @@ class FileManage extends Model{ header('Cache-control: private'); header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($filePath)); - header('Content-Disposition: filename='.$this->fileData["orign_name"]); + $encoded_fname = rawurlencode($this->fileData["orign_name"]); + header('Content-Disposition: attachment;filename="'.$encoded_fname.'";filename*=utf-8'."''".$encoded_fname); ob_flush(); flush(); }else{ @@ -971,7 +990,15 @@ class FileManage extends Model{ } static function getMimetype($path){ - $finfoObj = finfo_open(FILEINFO_MIME); + //FILEINFO_MIME will output something like "image/jpeg; charset=binary" + $finfoObj = finfo_open(FILEINFO_MIME); + $mimetype = finfo_file($finfoObj, $path); + finfo_close($finfoObj); + return $mimetype; + } + static function getMimetypeOnly($path){ + //FILEINFO_MIME_TYPE will output something like "image/jpeg" + $finfoObj = finfo_open(FILEINFO_MIME_TYPE); $mimetype = finfo_file($finfoObj, $path); finfo_close($finfoObj); return $mimetype;