2011-11-06 187 views
0

我試圖讓這段代碼的工作,但由於某些原因,所有的回波的能夠輸出正確的內容,但沒有頭似乎不想強制下載我的文檔。接下來是我正在嘗試構建的用於文件下載的文件。它被設置爲輸入如下代碼:downloader.php?f=13&t=doc根據用戶權限從兩個文件夾之一下載名爲201-xxx.doc201-xxx.pdf的文件。PHP READFILE()不是爲我工作,我不知道爲什麼

所有的邏輯工作到底部的標題信息。如果我註釋掉標題內容類型和標題內容處置,那麼它會將文件讀入瀏覽器。和這兩個行在內,它給我,說"Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found."

<?php 
//ob_start(); 
if (!defined('__DIR__')) define('__DIR__', dirname(__FILE__)); 
define("TLOJ_FSROOT", __DIR__ . "/"); 
define('WP_USE_THEMES', false); 
require('./wp-blog-header.php'); 

$lessonnumber = $_REQUEST['f']; 
$type = $_REQUEST['t']; 

    if ($lessonnumber < '10') { $threedigitlesson = '00' . $lessonnumber; } 
    elseif ($lessonnumber < '100') { $threedigitlesson = '0' . $lessonnumber; } 
    else { $threedigitlesson = $lessonnumber; } 
    $filenamestart = "201-" . $threedigitlesson; 

    $contenttype = 'application/octet-stream'; 

    switch ($type) { 
     case 'pdf': 
      $extension = '.' . $type; 
      $contenttype = 'application/pdf'; 
      break; 
     case 'doc': 
      $extension = '.' . $type; 
      $contenttype = 'application/msword'; 
      break; 
     default: 
      $contenttype = ''; 
      exit("It appears that you are trying to download a file that is not a lesson document. Please contact us if you believe this to be an error."); 
    } 

$filename = $filenamestart . '.' . $type; 
$current_user = wp_get_current_user(); 

//$siteurl = site_url(); 
$pathroot = TLOJ_FSROOT; 

$download_path = $pathroot . "1hoefl4priaspoafr/"; 
    if (current_user_can("access_s2member_ccap_extendedlessons")) { 
     $download_path = $download_path . "ex/"; 
    } else { 
     $download_path = $download_path . "st/"; 
    } 

$file_path = $download_path . $filename; 

$tlojmemberlength = tlojunlocklessons(); 

if (!is_user_logged_in()) { exit("Please log in to access the file"); } 

if (!current_user_can("access_s2member_ccap_downloadlessons")) { exit("You don't have access to download the lessons!"); } 

if ($lessonnumber > $tlojmemberlength) { exit("It appears you are trying to jump ahead! While I am excited at your enthusiam, let's not rush our study time."); } 

if (($lessonnumber > '195') && (!current_user_can("access_s2member_ccap_lastweek"))) { exit("Upgrade now to access the downloads for the five bonus lessons!"); } 

// build Final File Name 
$extendedmessage = ""; 
if (current_user_can("access_s2member_ccap_extendedlessons")) { $extendedmessage = " - Extended"; } 
$myfinishedlessonname = "Lesson " . $lessonnumber . $extendedmessage . " -- The Life of Jesus Study" . "." . $type; 

// echo 'Download Path: ' . $download_path . '<br />'; 
// echo 'Source/Lesson Number: ' . $lessonnumber . '<br />'; 
// echo 'File Name: ' . $filename . '<br />'; 
// echo 'File Type: ' . $type . '<br />'; 
// echo 'Allowed Lessons: ' . $tlojmemberlength . '<br />'; 
// echo 'Final File Name: ' . $myfinishedlessonname . '<br />'; 
// echo 'File Path: ' . $file_path . '<br />'; 
// echo 'Content Type: ' . $contenttype . '<br />'; 
// echo 'File Size: ' . filesize($file_path) . '<br />'; 

if (headers_sent()) { exit("Sorry but the headers have already been sent."); } 

    ob_end_clean(); 

if (file_exists($file_path)) { 
    header('Content-Description: File Transfer'); 
    header('Content-type: ' . $contenttype); 
    header('Content-disposition: attachment; filename="' . $myfinishedlessonname . '"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: '); 
    header('Pragma: '); 
    header('Content-Length: ' . filesize($file_path)); 
    flush(); 
    ob_clean(); 
    readfile($file_path); 
    exit; 
} else { exit("No file present."); } 


?> 

請幫助,因爲我一直在這個整天感到困惑沒有結束,爲什麼這是行不通的錯誤。 Filesize()拉正確的長度,所以我知道我正在看的路徑中有一個文件。 (我也是PHP新手,所以如果有什麼我不見了,請分享。)

在此先感謝!

+0

使用'is_readable()'而不是'file_exists()'會更安全。 is_readable既能確保文件存在,又能讀取文件。有很多文件存在,但無法讀取。另外,當你調用readfile時,'$ file_path'中有什麼? –

+0

剛剛看到這個評論/問題。我切換到'is_readable()',它仍然會拋出錯誤。當我取消註釋$ file_path時,它會迴應這個:'/ home5/[我的主機帳戶]/public_html/1hoefl4priaspoafr/ex/201-015.pdf'這是該文件的正確目錄。大文件的 – Crazycoolcam

回答

3

我不知道爲什麼這個工作,但我能解決這個問題,通過打破我的PHP文件分成兩部分。第1部分加載WordPress並執行邏輯驗證。然後文件1將信息傳遞給文件2以執行下載邏輯並寫入標題信息。

就像我說的,我不知道爲什麼這個工作,但是誰知道不是我不說,有時如果腳本時間太長來處理,然後頭也不會採取PHP更好的朋友。 WordPress可能會將這些腳本掛起的時間過長。

希望這個解釋能幫助別人誰有這個困難。

+0

我以前也必須這樣做。只有我可以去工作的事情。 –

7

如果它是一個大的文件,它不能與readfile發送。嘗試使用這個:

$handle = fopen($file_path, 'rb'); 
    $buffer = ''; 
    while (!feof($handle)) { 
    $buffer = fread($handle, 4096); 
    echo $buffer; 
    ob_flush(); 
    flush(); 
    } 
    fclose($handle); 
+0

你的意思是大於1兆。我所有的PDF和DOC都不到100k。 我應該用這段文字替換標題嗎? – Crazycoolcam

+0

我試圖只替換readfile行,錯誤仍然出現。 我也試着註釋掉所有的標題行來支持這段代碼,並且它在瀏覽器中傳遞了這個文件。 – Crazycoolcam

+0

非常感謝!爲了使你的代碼具有可移植性,必須讓ob_flush和flush被調用。我花了3小時尋找爲什麼函數不工作:) tnx! –

0

Chrome的告訴我:「錯誤6(網:: ERR_FILE_NOT_FOUND):文件或目錄無法找到。」 和Firefox一樣,這個文件並不存在。

雖然同PHP文件處理不同類型的我是有PNG和ICO問題下載,我嘗試了一些方法,只有顯示的圖片,但沒有提示需要下載框。

最後我發現感謝Crazycoolcam,Wordpress是問題。 我包括PHP到一個文件中我曾呼籲「tools.php」, tools.php它裏面有一個包括使用WordPress的主頭文件, 彌補我分裂這個問題我的工具文件到WordPress版本和非WordPress的版本,並在寫出文件後包含wordpress的一半。

+0

很高興看到這爲您解決。我已經調整了我的一套兩個文件,但解決方案仍然是兩個文件。 我也剛剛發現wordpress使用自己的一系列標籤,'?s = xx'不起作用,因爲我相信WordPress使用's'變量。我還沒有深入瞭解哪些字母組合不好,但我知道有一些。 很高興您已啓動並重新運行,這有助於解決您的問題。 – Crazycoolcam

+0

如果您試圖強制瀏覽器使用 下載文件'Content-Type:application/octet-stream Content-Disposition:attachment;文件名=「your-file.jpg」' 但Chrome會給你** ERR_FILE_NOT_FOUND **並且Firefox也會因爲「未找到」而失敗(奇怪的是Opera似乎有效)嘗試添加: 'header('HTTP/1.0 200 OK',true,200);' –

2

如果你試圖迫使瀏覽器下載文件,使用

Content-Type: application/octet-stream 
Content-Disposition: attachment; filename="your-file.jpg" 

而Chrome爲您提供了ERR_FILE_NOT_FOUND和Firefox也失敗,「未找到」(奇怪的歌劇似乎工作)嘗試添加:

header('HTTP/1.0 200 OK', true, 200);

+0

這解決了我的問題。我想這是因爲我在URL重寫中處理這個,所以技術上狀態默認爲404,然後將其正確設置爲200。 –

0

只是另一種可能性,此間爲什麼它不工作。這是我的原因。有趣的是,file_exists返回true,但沒有任何形式的文件供公衆下載使用,但沒有正確設置下面的內容。

PHP有一個叫做的open_basedir

確認這是正確的相關設置爲您的託管環境設置。 open_basedir可以通過php.ini編輯

相關問題