PHP 标头将输出到屏幕的所有内容放入下载的文件中


PHP headers putting everything that was output to screen into downloaded file

我有以下PHP代码,使用标头从服务器下载文件:

$file = 'Order.txt';
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
readfile($file);

这段代码工作正常,但是我把它放在一个带有HTML表单的文件中,并且它使用if isset运行,所有HTML代码都放在文件中,以及我在PHP中回显的任何内容;我实际上想要的数据在文件中在最后。

我无法弄清楚标题中是什么导致它在下载时将屏幕上的所有内容写入文件。服务器上的文件没有更改,并且应该是这样的。

感谢您的任何帮助。

这是所有代码...

    <form action="<?=$_SERVER['PHP_SELF'];?>" method="post"><br>
Order Number: <input type="number" name="orderNo" size="10"/>
<input type="submit" name="Download" value="Download" />
</form>
</body>
</html>
<?php
if(isset($_POST['Download'])){download();}
function download()
{
$conn = mysql_connect('localhost', 'root', '');
mysql_select_db('amazondb', $conn); 
 $result = mysql_query("SELECT ID, PurchaseDate, BuyerName, ShipCity, ShipState, ShipPostalCode, ShipCountry,
                          ShipAddress1, ShipAddress2, ShipAddress3 FROM imported_orders");
$orderNo = $_POST['orderNo'];
$row = mysql_fetch_array($result, MYSQL_ASSOC);
if($orderNo>0&&$orderNo<=count($row))
{
    $file = fopen('Order.txt', 'w');
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
    {
    if($row['ID']==($orderNo))
        {
        echo "Hello";
        fwrite($file, $row['BuyerName'].PHP_EOL .$row['ShipAddress1'].PHP_EOL .$row['ShipAddress2'].PHP_EOL  .$row['ShipAddress3'].PHP_EOL  .$row['ShipCity'].PHP_EOL      .$row['ShipState'].PHP_EOL  .$row['ShipPostalCode'].PHP_EOL  .$row['ShipCountry'].PHP_EOL);
        }
    }
    fclose($file);
$file = 'Order.txt';
header("Cache-Control: private");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
readfile($file);
}
 else{echo "Please enter a valid Order Number"; echo $orderNo;}
}

在文件开头移动此代码,因此您将得到:

<?php
if (your condition to output file) {
    $file = 'Order.txt';
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");
    readfile($file);
    die();
}
the rest of your file....

另一个解决方案,在文件添加的最顶部:

<?php
ob_start() or die('Cannot start output buffering');
... your page

在第一个header之前添加:

$file = 'Order.txt';
ob_end_clean();
header("Cache-Control: public");
...
readfile($file);
die();