PHP - скрипт принудительного скачивания файлов - не работает в операторе IF - PullRequest
2 голосов
/ 27 ноября 2011

Ниже приведен код с выражением IF, вызывающим страницу загрузки.

if ($currentpdt<$updatedpdt)

  echo "updatedpdt is greater than currentpdt.";

else
  echo "updatedpdt is not greater than currentpdt";
  require("dlfile.php");

?>

На этой странице есть и другие вещи, в основном только SQL-соединения для определения переменных. Обратите внимание, что если оператор IF имеет значение false, требуется файл «dlfile.php». Этот файл выглядит следующим образом

<?php
// local file that should be send to the client
$local_file = 'dl.zip';
// filename that the user gets as default
$download_file = 'your-download-name.zip';

// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5; 
if(file_exists($local_file) && is_file($local_file)) {
    // send headers
    header('Cache-control: private');
    header('Content-Type: application/octet-stream'); 
    header('Content-Length: '.filesize($local_file));

    header('Content-Disposition: attachment; filename="'.$download_file.'"');

    // flush content
    flush();    
    // open file stream
    $file = fopen($local_file, "r");    
    while(!feof($file)) {

        // send the current file part to the browser
        print fread($file, round($download_rate * 1024));    

        // flush the content to the browser
        flush();

        // sleep one second
        sleep(1);    
    }    

    // close file stream
    fclose($file);}
else {
    die('Error: The file '.$local_file.' does not exist!');
}

?>

Когда я запускаю файл dlfile.php сам по себе, он прекрасно работает, и приглашение загрузки отображается так, как должно. Однако, когда он вызывается первым файлом, это то, что я получаю.

PKÇ`w?6J@T1popup.jsUT   %DÍN%DÍNUxz{]’ÏNÃ0ÆÏÉSX»¬›ª¶š8 PÅ×Á¤©ÛÚ8ÊŸmíÝIX7MœâXŸþì¤ZzE™`:Ä6vÜÀ/·œ}8?(ÝUæ   zÔh…G©‚£Ò-¡#Êã£Ò_î¦k9kæˆAxøÝÛÚƒ’XÀ{Lj1!P÷¯Ïœ<   éÇ䌱›CÎ8º…™H¡!ü¹DÔbÔŽÑJ´éJÕÍË©äÍ% ,:Îöˆ0xožÊ2awŸ® Û—Q†§ÂæÅÕµ|[rÎÊœ·J÷÷èÿDÎÂÂ4_PÃÊ°µ¦|$)Òp)n•EéÉ*té:¡‹ÊIKc*qõŒ.w>².a$ªoÑŒ˜dGÕú¡~¬ª|@Õ¾~¨ªÕsZM\E'6¿ø+È Î >këeиËu~çt+UÙRÑ‘.~‚u¹g›3?ó_PKÇ`w?ÌmO‹jpreview.phpUT %DÍN%DÍNUxz{­VmoÛ6þlýŠ«ÔöKq›]lÙh“¬/ȶ ñVÛ`Ðe3–I¤ì&AþûîHù-ΧmùDw÷<<ÝÝÃSXÎÊ Ž¥)7R%s1­4³BI0ÜZ!§&ÐüïJh>V2å­fÎyöêÖŒ}p„Ív/ˆæ=·°dZ°IÁ äZ-@Ȳ²àÈèh ƒÄ­£ñûËÑM´5ÿj·a»8ƒf³¥3& dÜÇxî%«Åmûg@È   2n3#ã>Ä[ÓE«ììê‰P:’Òɘå‡ìh|Âî,”½?ÀØû}=S<5ÄA˜ž‚Ðøæ,›ƒfvQ ȸò– ª²ùmûgØ´E3ž¨oc‘ ·®}‚]ûz&ÊÃV•OU¦ÛLÝ\Zn,äJÂ"ª2P*“jQZ°lÊM rh«KeZ4¬ÇÐì{ÿ ‰ôA£áRóéXó²`¨‡0nýY‡µ[Ñ÷Ãv«Æ´c#ÂcoÎ?¼ÁÅåÕåèò‚,D¢f™@ü¦%Êì¼µ–/(…ª¹å©…[¶du†·háYo'Jã?ÀdV³tŽ`(Ôª’f(‹ˆúѽ··a^Њ۸r¸ÞÛJK¤S²á à"Iš¬Ù†µ2P$D7©D‘AÉ4[`6°Vt61Ù‡úb€JÁ‘ªI¨k5³“󋄃Üëˆ(ð%¹ö|0©cOžF¢=!ç:Î¥ø\ 9ç^‡:Í>>«çÞ°RÝž%WâÖÁ¨U u:|mïôo"I¢ÏÓ’+që`×M0=·U _º>9óàD™ÜöÉ›/Ñ“]ØŽ‰ý°Æ$;AkvÞ³äeê¸/q J¯ZC÷$„ˆƒËTeÜÉ«–-Ñþ"Û‘T~ZÇÿ…Ósu¢‡ƒ 迸øõ|ôõú>Œ~¾‚ëßÞ]}<‡°Ç_^ŸÇñÅèÂ;N£“.Œ4“F+âøò—0€ú'œY[žÅñjµŠV¯#¥§ñèsL'Æ…R†G™ÍÂAÐw=,˜œ&!—ÎÀY6}Ú¼4uçÖµ} cƒ§3…×êŒÕ¡¼LB\º–KÛ±w%¡~JBË¿Yw|PCïÆ);o¾7Ò=/ðÂû¿¸…Q7o~ø±ÓÝ4†ôZVØ‚~Â6Áälך/_õcïÁBÈ9h^$¡±wø0ã܆0Ó<¯-ñ„‘v#œC¬"œ(­:ì&xNµªdÖIU¡ôÙwyž÷ð¦×S!qW¿*¿õƒYào*|½œ-Dqw¿s1ÉŽá-~°ÇðKnEŠƒ}ï®EÞqÉ]=Q?.w´_ú›º!®m^øN‚ëër8ØmK}ïῬ–Å.èéµHèß©ú¾;añ–Â7¿z¦Žâš:‹+{üǹŸÿ¦!~¿>ž»Ú}qeñãà?œæ(P^ä‘«k«ºª©b<Ç=»¿ýØÏTß]hÿPKÇ`w?6J@T1 ¤popup.jsUT%DÍNUxPKÇ`w?ÌmO‹j ¤preview.phpUT%DÍNUxPK‰X

Я думаю, что браузер пытается прочитать файл как веб-документ, но я не уверен. Я попытался извлечь теги из dlfile.php и также переключил

header('Content-Length: '.filesize($local_file));

до

header('Content-Disposition: attachment; filename="'.$download_file.'"');

код все еще выполняется нормально, но генерирует тот же странный вывод при вызове из исходного файла.

Я попытался просто поместить код из dlfile.php в исходный файл и получил тот же вывод.

Что не так?

Ответы [ 4 ]

3 голосов
/ 27 ноября 2011

На самом деле это не так.Без фигурных скобок ваш код интерпретируется как:

if ($currentpdt<$updatedpdt) {
    echo "updatedpdt is greater than currentpdt.";
} else {
  echo "updatedpdt is not greater than currentpdt";
}

require("dlfile.php"); //Is required no matter what

Попробуйте использовать фигурные скобки для повышения читабельности и исправьте эту проблему:

if ($currentpdt<$updatedpdt) {
    echo "updatedpdt is greater than currentpdt.";
} else {
  echo "updatedpdt is not greater than currentpdt";
      require("dlfile.php"); //Now just included if the if is false
}

Кроме того, если вы выводите что-то из первого файла, а затем второгоФайл не сможет установить заголовки, и будет выведено сырое содержимое файла.Поэтому вам нужно удалить эхо из вашего первого файла, чтобы выводилось только содержимое zip.

2 голосов
/ 27 ноября 2011

Помимо синтаксической проблемы, которую другие правильно прокомментировали, вызывающий файл имеет echo() вызовов, а файл, который он включает через require(), имеет header() вызовов. Но header() вызовы не будут работать, если они следуют за любым выводом на страницу. Так что вам нужно избавиться от этих echo() звонков. Это может быть источником дурацкого вывода, который вы получаете.

2 голосов
/ 27 ноября 2011

У вас есть проблема Dangling else, если вы не используете скобки, в блоке else рассматривается только строка, за которой сразу следует.

http://en.wikipedia.org/wiki/Dangling_else

1 голос
/ 17 мая 2012

Ну, эхом проблемы. Попробуйте добавить эти две строки в начале вашего кода, вы увидите проблему:

error_reporting(E_ALL);
ini_set('display_errors',1);
...