PHP header() 下載檔案的問題

問題1:

我自己寫了一個上傳和下載檔案的網頁,上傳後的檔案是存在硬碟,只有路徑是存在資料庫。上傳檔案沒有問題,因為我確實在資料夾裏發現成功上傳的檔案。

我的問題是在下載檔案,我是使用以下的函式強制下載檔案:

header("Content-type:$mimetype ");

header("Content-Disposition: attachment; filename=$namebydate");

readfile("$path");

$mimetype是檔案的MIME。

$path是我的檔案存放路徑。

我下載檔案的時候,檔案都成功的下載下來,可是問題就來了! 這些下載的檔案(各式各樣的:jpg,doc,mp3...等),都開不了。我用notepad開這些檔案內容來看,才發現到所有我下載下來的檔案,內容都自動被加了<html></html> 這個標籤。

所有下載的檔案都是這樣,所以軟體都無法正確辨識,導致都不能開啟。

我確定我上傳的那一部分沒有問題,因為上傳到我硬碟的那些檔案都可以正常顯示和開啟。但是只要透過下載的方式,下載到電腦裡的檔案,都會出現我上面說的問題。

-----------------------------------------------------------------------------------------------

問題2:

也是我這個網站的問題。我想請問一下,如果我想限制使用者上傳含有中文檔名的檔案,只能上傳英文名字的檔案,程式應該要怎樣寫呢? 是要用什麼函式判斷檔名是不是中文字,還是辨識中文字的ASCII碼?

請問要用哪些函式呢?

--------------------------------------------------------------------------------------------

問題3:

我上傳的檔案有些是有空格的,(例如: who are you.rar)。上傳後的檔案名字依然是有空格的,但是在我使用attach的下載函式下載的檔案,只會顯示who,後面的名字都不見了。不用說,這個檔案一定是毀壞的0byte。我想請問一下我要怎樣解決不能辨識空格的問題呢?

-----------------------------------------------------------------------

想請教各位大神們~~~

我最近被這些問題搞得我快死掉了XD

謝謝幫忙~~

Update:

知識貧名大大,我試了你給我的程式,結果還是一樣,還是會加 在內容裡。

http://sifeng.no-ip.org/upload/attachment.php?id=9...

http://sifeng.no-ip.org/upload/attachment.php?id=9...

這兩個是我上傳的檔案,你可以試看下載來看結果(notepad)開

http://sifeng.no-ip.org/upload/attachment.phps (這是我的程式碼)

哈哈~~

辛苦了~

3 Answers

Rating
  • Lv 4
    1 decade ago
    Best Answer

    安啦

    請大大試試看我寫的~

    <?php

    //寫檔頭資料

    header('Pragma: public');

    header('Expires: 0');

    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

    header('Cache-Control: public');

    header('Content-Description: File Transfer');

    //依檔案副名而更改檔頭資料

    header('Content-Type: application/force-download');

    //強迫下載

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

    header('Content-Transfer-Encoding: binary');

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

    @readfile($namebydate);

    ?>

    2008-01-05 09:25:54 補充:

    你在上傳一張jpeg

    然後下載她

    並把

    >>

    //依檔案副名而更改檔頭資料

    header('Content-Type: application/force-download');

    <<

    改成

    >>

    //依檔案副名而更改檔頭資料

    header('Content-Type: image/jpg');

    <<

    再上傳試試看

    2008-01-08 07:25:23 補充:

    如果還是不行

    請你在我的程式碼的最上方加寫一個ob_clean();

    所以把她寫這樣

    ob_clean();

    //寫檔頭資料

    header('Pragma: public');

    header('Expires: 0');

    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); ......

    試試看

    2008-01-08 07:28:40 補充:

    判斷是否中文的函數是:

    function validate_chinese($str){

    if (mb_strlen($str,"Big5") == strlen($str))

    return '不是中文';

    else

    return '此字串為中文';

    }

    2008-01-08 21:34:55 補充:

    我函數重寫一下 = =

    function validate_chinese($str){

    if (mb_strlen($str,"Big5") == strlen($str))

    return false;

    else

    return true;

    }

    這樣才對 = =

    Source(s): 自己, 自己, 自己
  • Anonymous
    5 years ago

    到下面的網址看看吧

    ▶▶http://qoozoo09260.pixnet.net/blog

  • 1 decade ago

    問1:

    你在下載的時候,先確定它有沒有 include 其他檔案

    有可能是你在 header 時先輸出了<html> </html> 並且將 顯示錯誤訊息關閉

    問2:

    你真的要限制中文檔名的話,就從javascript 著手吧

    for (var i=0; i<str.length; i++){

    if (str.charCodeAt(i)>256)

    return true;

    }

    去判斷 file 的字元是否含中文

    或是另一個方法一樣允許上傳中文檔名

    因為你連 $mimetype, $namebydate 都存成資料庫了,不如多增加1個欄位是存上傳後的檔名

    ex:

    上傳 "測試檔.doc" 上傳後用程式改名為 "T".time().".doc"

    並將 "測試檔.doc" 與 "T100000000.doc"(T+時間+副檔名) 存入資料庫中 這樣下載時就可以用中文檔名囉

    問3:

    可以承問2,在 filename=$namebydate

    改成 filename=".urlencode($namebydate)

    有空格問題或中文問題應該皆適用

Still have questions? Get your answers by asking now.