Я работаю над скриптом, который позволяет пользователям загружать файлы, хранящиеся в Интернете. Кажется, что он работает с файлами изображений, но с файлами 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 на 1 КБ больше, чем соответствующие файлы PDF. В блокноте дополнительный контент в файле PDF, загружаемом как .PHP, выглядит следующим образом:
Û¼ 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©ÒP ió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˜_^çî>z flø€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°Ús VTö ìÄ^úª• 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
Что я делаю неправильно, что вызывает это?
Добавление ob_clean();
and flush();
функции перед readfile();
функция, может быть что-то стоит использовать, как указано в руководстве PHP по этому вопросу.
readfile () http://php.net/manual/en/function.readfile.php
ob_clean () http://php.net/manual/en/function.ob-clean.php
flush () http://php.net/manual/en/function.ob-flush.php
Эти функции отсутствуют в вашем опубликованном коде.