2010-08-25 96 views
1

最終目標是讓用戶下載.csv文件。現在我只是測試下載一個簡單的文本文件:test.txt。這個文件中唯一的東西是「測試」一詞。使用PHP強制下載文件並提供空文件

這裏是files_to_download.php

Test file: <a href='test.php?file=test.txt'>Test.txt</a> 

代碼的HTML代碼test.php的:

if(!(empty($_GET["file"]))) 
{ 
    $file_name = $_GET["file"]; 
    $path = "path/to/file"; 
    $fullPath = $path . $file_name; 

    if(ini_get('zlib.output_compression')) 
     ini_set('zlib.output_compression', 'Off'); 

    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: inline; attachment; filename=\"$file_name\""); 
    header("Content-Type: text/plain"); 
    header("Content-Transfer-Encoding: binary"); 
    readfile($fullPath); 
} 

我已經嘗試了上述標題的變化,增加更多的和刪除等。以上似乎是這個網站上最常見的推薦。

我也試着改變

header("Content-Type: text/plain"); 

header("Content-Type: text/csv"); 

,並得到相同的結果:空的.txt或.csv文件。

當我從服務器直接打開它們(文件瀏覽器)時,這些文件不是空的。我已經檢查過這些文件的權限,它們都是644,所以整個世界至少可以讀取這些文件。該目錄是777.

是否有Apache服務器上的配置,我需要指定可能不是或我缺少上面的東西。

感謝您的期待!

+1

你應該檢查'$ fullPath'並確保它是你想要的路徑。在你的例子中,'$ fullPath'是'「path/to/filetest.txt」'而不是''path/to/file/test.txt「'。 – Umang 2010-08-25 07:52:28

+0

如果你用'echo'foo''替換'readfile($ fullPath)'',那麼代碼就可以正常工作,所以我正在爲路徑問題投票。 – cbednarski 2010-08-25 08:01:02

回答

6

在大多數情況下,路徑是錯誤的

+0

這恰好是問題所在。我將文件生成/導出到一個頁面中,然後可以在不同的頁面上下載。麻煩的是,這個文件的路徑和它的名字可以根據日期改變。所以,我將名稱和目錄傳遞給會話。問題是我沒有在腳本的頂部包含「session_start()」。現在就像一個魅力! – blandau 2010-08-25 16:39:09

1

閱讀文本文件,然後echo將文本輸出到您的header()調用之後。

以下是我有我的CSV下載設置:

//downloads an export of the user DB 
$csv = User::exportUsers(); 

header('Content-disposition: attachment; filename=userdb.csv'); 
header('Content-type: text/csv'); 

echo $csv; 

exportUsers()創建CSV數據。您可以輕鬆地將$ csv替換爲文本文件的內容,然後將其回顯出來。

並且就您的文本文件而言,您可以使用file_get_contents()將文件的內容轉換爲字符串。然後回顯那個字符串。

+0

這裏的好處是你可以''var_dump($ csv)'確保它包含你認爲它包含的東西,然後指責標題。 – cbednarski 2010-08-25 08:00:24

0

嘗試設置該文件的內容長度:

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

此外,請記住有這樣的:file inclusion

1

在我的情況下,路徑是正確的。而下載強制是在windows上工作,但不是mac。

經過幾次測試,我發現頭部Content-Length失敗。我用的是在一個完整的URL功能的文件大小,如:

$url_my_file = "http://my-website.com/folders/file.ext"; 
header('Content-Length: '.(filesize($url_my_file))); 

我通過

$url_my_file = "http://my-website.com/folders/file.ext";  
$headers = get_headers($url_my_file, 1); 
header('Content-Length: '.($headers['Content-Length'])); 

並更換...它正在工作:)