使用php header撰寫間接下載程式執行正常,但下載的檔案不能執行...?

edited 十月 2013 in PHP新手區
請問各位大大,我改了網路上的範例,用php寫間接下載,是可以正常下載,下載回來的檔案大小也都符合,問題是下載回來的檔案都有問題,rar顯示毀損,exe無法正常執行....
請問這種問題該如何解決?
(不好意思,我的php學齡只有一星期,所以很多都不太懂)
程式碼如下:

function Use_PHP_Download($Download_Filename)
{
//使用php間接下載檔案
if( $Download_Filename == "" )
{
echo "<html><body>未指定檔案路徑及名稱!</body></html>";
exit;
} elseif ( ! file_exists( $Download_Filename ) )
{
echo "<html><body>找不到檔案!<br>";
echo $Download_Filename.'</body></html>';
exit;
};
//取最後三個字
$ext1 = substr($Download_Filename,-3);
switch ($ext1)
{
case "pdf":$ctype="application/pdf";break;
case "rar":
case "exe":$ctype="application/octet-stream";break;
case "zip":$ctype="application/zip";break;
case "doc": $ctype="application/msword";break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpg": $ctype="image/jpg"; break;
default:
echo "<html><body>您不可以下載這個檔案!</body></html>";
exit;
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: ".$ctype);
$user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
header( "Content-Disposition: attachment; filename=".basename($Download_Filename));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($Download_Filename));

$handle = fopen($Download_Filename, "r");
$contents = fread($handle, filesize($Download_Filename));

fclose($handle);
print ($contents);
flush();
}

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1619

評論

  • edited 五月 2006
    1. 環境
    2. 你如何使用這個函式?
  • edited 五月 2006
    我的主機是linux Red Hat 9 ,Aphche + PHP 4 + MySQL,

    函式使用 由phpdown.php 中先 include ("Function.php")
    要下載的時候使用 Use_PHP_Download($filename);
    其中$filename="download/".$_GET[Download_File];

    不知道這樣是否正確?
  • edited 五月 2006
    今天發現下載的檔案最前頭總是會多了一行空白,
    只要把空白行消掉程式就可以正常執行或解壓縮,
    看了一下程式也不知道那一行空白是在那裡被加上去的?
    後來改了部份程式碼還是搞不懂問題出在那裡?
    請各位大大幫我解答!
  • edited 五月 2006
    作業環境是使用 UTF-8 編碼嗎?也許該檢查一下 Apache 與 PHP 的設定,看看會不會附加一些額外的資訊。

    過去遇到這個問題的關鍵在於 UTF-8 的 BOM 字元導致檔案無法判讀。
  • edited 五月 2006
    感謝各位大大的解答,小弟終於找到原因了,
    原因如下,
    首頁 index.php 會呼叫 php_download.php ,
    被呼叫的 php_download.php 並沒有問題,
    問題出在 index.php的開頭,也就是說index.php的內容如下,
    ============================
       <--- 就是在index.php中的檔案一開始這裡空了一行,
          然後才是php的程式,
    <?php
    .....程式內容....
    ........
    ?>

    就因為開頭那一行空白導致下載回來的檔案多了一行空白,
    雖然不知道什麼原因,也許是我的程式寫法有問題吧!
    不管如何也要謝謝各位熱心的大大們。
  • edited 五月 2006
    在 php 檔案中,所有在 <?php ...... ?> 以外的東西都當作是 HTML,全部一字不漏地送到 client,包括空行在內,所以 index.php 第一行的空行也被送出..........

    相信你花了不少時間找這個毛病吧.......讚!
Sign In or Register to comment.