文件有时下载为.PHP而不是.PDF?
我正在编写一个脚本,允许用户下载在线存储的文件。它似乎总是适用于图像文件,但对于PDF,浏览器有时会下载.PHP文件而不是.PDF文件 我还没有用任何其他文件类型测试脚本,所以我不知道问题是否仅限于PDF,或者它是否也会发生在其他类型上 这是我的密码:文件有时下载为.PHP而不是.PDF?,php,download,Php,Download,我正在编写一个脚本,允许用户下载在线存储的文件。它似乎总是适用于图像文件,但对于PDF,浏览器有时会下载.PHP文件而不是.PDF文件 我还没有用任何其他文件类型测试脚本,所以我不知道问题是否仅限于PDF,或者它是否也会发生在其他类型上 这是我的密码: $mimeTypes = array( /* images */ 'png' => 'image/png', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif
$mimeTypes = array(
/* images */
'png' => 'image/png', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp',
/* spreadsheets */
'xl' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'csv' => 'text/csv', 'sdc' => 'application/vnd.stardivision.calc', 'odc' => 'application/vnd.oasis.opendocument.chart',
/* text files */
'doc' => 'application/msword', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'odt' => 'application/vnd.oasis.opendocument.text', 'rtf' => 'application/rtf', 'rtx' => 'text/richtext',
/* PDF */
'pdf' => 'application/pdf'
);
$file = __DIR__ . '/files/' . $row['disk_name'];
header('Content-Description: File Transfer');
header('Content-Type: ' . $mimeTypes[$row['ext']]);
header('Content-Disposition: attachment; filename="'. $row['name'] .'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
die();
下载的.PHP文件比相应的PDF文件大1KB。在记事本中,作为.PHP下载的PDF文件中的额外内容如下所示:
Û¼T"gS_åœx¨fꙸx0]Ï~0î…[#X7beú
Œ¾){(‹Ã ‰ždêò¤ž
^`ô}\ȯDdìè¬#¸A,.ÛàÇ3ðuúÑÅIôo GP‘pð.bWædÎVª8¨‹ÃÚï~“½1ÚùYGrƒ^º9YçãžÁa0]žÿ{VP\§•ÑúÄ›\²/Óa4§ R Â×ïYGrøå3¨$Ë Køpf%„ HÐá@~Tyw«ðŠfPý—@òwæà– Ác8rI:2ëÅ*P5„*‚øïÖ`»´æí£³Èx€–T$W³d´ HÏy»…G˜ÊÃ?Ž=TÐð+PÊÃc6’q
¥üQ˜Q¦GØšOQò‹¹t‡€öGz‚‘«mØÌ&Æ5kPnd Ôs˜ù7Ê¢ø=à¦Uïºd"Âœ¸ÐîÌóÏlnŒVšÊ¤P[¾ò¸ª‹„mÊO/
‹xï$ Ƶ¤%0´7M?ÒÙdaã1ÓKùaPÌZó†A¬møY¨¿D›K²Ji;w €9ö>*®h³³†‚wRy¶=s+U\ñd¤™ýØ·ÇΗú®Q–kÈ(˜´jñWQd©¢à¦MÌw½Ÿt°Z±Þa¾co{Ö`ȳŸô¯òje©ÒPióBL$“ÓP/&´ÆÞµš9h–)lŸk )
À„uÚº'Ûˆ“Ô_4~‹}]?óâùg3 Ô¨?ËL¡ê*¢‰“çS) M³‘*LâGG…®sœùw;¤N`Åx½cëu 'oJæeÆ_M½ËÒXÈ…³„{ÈŃ)õ³P´œ»SI™P,éH@¸’ÄÌ^ÓÙb§[id˜_^çî>zflø€aÞ‹€% G‘,=ùI¦ÕaˆVEÃvoûl•>`ÂÆJ^V›ƒ
:"ˆi„ÄÐ’@€Ð—ìRy¯ '¡šË¢›Øƒ
Æ[&ÉF›’_+Õ¢$ÜÜMãºÏ€u},w†¼BœÄA`R¤dYm)Œ$¤<},<³Ó_¥æËÒP|&Tj; •ê¥U0h|&Õ}©¸t‹s *1žõŽ2„E'…ÛnäYjë— Tg¡’v•[ ¥ì¤îK¨ä–t$ üñ\؉¸X€R+e^ªx;£ÌË&ä´R®ðúpR_Åíf ^,vžÒJcAŽ•<O€LR1%ªP¡Ãê–x]º¬#Îs?¨üVŽ*jæ ¤Úbª£ê£«â7îm]û$ ÇUfGÄo£ÒÛþO#ƒÞ©?t±ª·PN¹¡8¨i°<ôyZ_lGÞJÕ\Y{®Hõ X~
¸Å‘"H; «™
a™Žl%BÅׄ]Œ‹ešµR…JÏeÕÒ(gH©,ÓÚaIR/¤¬Ÿ#? J ¸’„“ã.žÚ#§j¥Š³çŠtâÅ°^)¹Ï(Pm°¢¨–ÕÒ‹ˆk)ÂÚý£Ò5 $W¬WPa&/çG1ÈDaÕû²Žâ:¥§š™”2HŸˆUë«WŒRF°“²yݳYEÂÁoØŠ?@‘dŠ-HVÑîÝ?jÆr)¨º7¥Bd–•u$¼&Eê®eùµRÂf,UË Û«‚•jõYšU²±Ú!ò#¼–aÐÍU°ÚsVTö
ìÄ^úª•
Tصr‡gPùÅ™0©S”ûË‘.œÅå• ³‘„ôjÞ6ËÂOçÌAj?j÷,¬ÎpRŸx}Äd$ÌpÓxÇnÚŽ3yä/rž©öU™ö¢‘ú²ÇGÁ£È¡/L<賎Drþy·³Ú¨•*nîªS±µN+¶IÓª5ô®üÕ¶fâ•×|+ëvØ×J·¶>ž²ÞÅ&4k>HTTP/1.1 200 OK
Date: Fri, 26 Jul 2013 03:24:16 GMT
Server: Apache/2.4.2 (Win64) PHP/5.4.3
X-Powered-By: PHP/5.4.3
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: public
Content-Description: File Transfer
Content-Disposition: attachment; filename="bst-bmp180-ds000-08.pdf"
Content-Transfer-Encoding: binary
Connection: Keep-Alive, Keep-Alive
Content-Length: 752201
Keep-Alive: timeout=5, max=99
Content-Type: application/pdf
T“gSåœx–f”™¸x0]x0~0î…[X7beú
Œ¾
^`本月的《《年》的《年》的《《年》的《年》的《本月的《年》的《年》的《本月的《年》的《本月的《年》的《本月的《年》的《本月的《年》的《本月的《年》的《本月的《本月的《本月的《本月》的《本月的《本月的《本月》的《本月的《本月的《本月》的《本月的《本月的《本月》的《本月的《本月的《本月的《本月》的《本月的《本月的《本月的《本月》的《本月的《本月的《本月》的《本月的《本月》的《本月》的《本月的《本月的《本月的《本月的《本月》的《本月的《本月的《本月》的《本月的《本月的《本月的《本月的《fPý-wæ–C 8RI:2ý*P5ýêêêêêêx–T$w³dêHêy…Gêê195;=TêêêêêxêTêdêHêHêyê
"mØQØGØOQØtØGzØmØGØGØOQØtØGØGØGØGØtØGØGØtØmØdØsù7ØUØdØdØnØVØP/
è™ýØÎQ–kÈ(ýjñWQdýMÌw½tŸZÞa¾co{ýߖje)PÅBL$“P/”lýk)
À™P、 徖H¸ÌÓÙb§[id徖uî>z徖flèaÞ€%G',=IùaÕaˆVEÃvo l•>ÆJòV›402;
:“我”是“我”的意思
正如PHP手册中所述,在readfile();
函数之前添加ob\u clean();
和flush();
函数可能是值得使用的
readfile()
ob_clean()
刷新()
这些函数没有出现在您发布的代码中。这很奇怪。这几乎就像有一个keepalive连接,最后一个请求被保存为输出。这是我唯一能想到的事情,因为您的头在文件中,并且在文件的结尾…两件事情永远不会发生。@Brad和OP。您不应该被重新设置吗首先读取文件?readfile($file);
在die();
@Nate Ah ok。您是否尝试过使用ob_clean();flush();
与它结合使用,如该页所述?还是不会有什么不同?在头()中不需要换行
,每一个都定义了一个单独的响应头。PHP会自动用换行符将它们分隔开,如果不这样做,任何浏览器都无法使用。@Fred,在readfile()
起作用之前添加ob_clean();flush();
!我没有注意到我不知何故漏掉了这些行。想回答这个问题吗?