文件有时下载为.PHP而不是.PDF?

文件有时下载为.PHP而不是.PDF?,php,download,Php,Download,我正在编写一个脚本,允许用户下载在线存储的文件。它似乎总是适用于图像文件,但对于PDF,浏览器有时会下载.PHP文件而不是.PDF文件 我还没有用任何其他文件类型测试脚本,所以我不知道问题是否仅限于PDF,或者它是否也会发生在其他类型上 这是我的密码: $mimeTypes = array( /* images */ 'png' => 'image/png', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif

我正在编写一个脚本,允许用户下载在线存储的文件。它似乎总是适用于图像文件,但对于PDF,浏览器有时会下载.PHP文件而不是.PDF文件

我还没有用任何其他文件类型测试脚本,所以我不知道问题是否仅限于PDF,或者它是否也会发生在其他类型上

这是我的密码:

$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();
!我没有注意到我不知何故漏掉了这些行。想回答这个问题吗?