2014-01-27 98 views
1

我已經搜索了相當一段時間,沒有看到可以解決我的問題的東西。我正在一個顯示文件列表的頁面上工作,當OnClick時,用戶將被允許下載該文件。文件路徑存儲在MySQL中以允許下載。
目前我正在使用SQL查詢的while循環來檢索和顯示(回顯)文件。在MySQL使用存儲在MySQL中的文件路徑下載PHP OnClick文件

  1. LOGID =自動增量ID
  2. LOGDATE = DateTime值
  3. fileLink存儲在MySQL =文件路徑(例如C:\ WWW \瓦帕\ file.txt的)

    while ($row = mysql_fetch_array($result)) { 
    $ID =$row['logID']; 
    $date =$row['logDate']; 
    $file =$row['fileLink']; 
    echo $ID, ' '; 
    echo $date, '<br/>'; 
    } 
    

所以在現在它顯示瞭如下畫面,
1 2014年1月25日9時33分27秒
2 2014-0 1-26 9時37分28秒
3 2014年1月27日9時38分09秒

我想提出這是「回聲$日期」爲超鏈接的日期和時間(我有這樣的煩惱)這將允許用戶點擊下載文件。我有這是文件下載代碼,

<?php 
if (file_exists($file)) { 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 
exit; 
} 
?> 

的問題是,當此下載代碼的網頁上,下載框出現在頁面加載時向右走,並提供下載的文件的唯一選項「2014-01-27」,這是SQL while循環期間最後一次檢索到的項目。

我已經讀過下載代碼應該放在另一個.php文件上,這個文件在需要的時候會被調用,但我是PHP新手,並且不知道如何去做。

主要是我的問題是,

  1. 如何使迴盪項目與onclick事件的超鏈接觸發下載。
  2. 如何將文件路徑綁定到相應的回顯項目,因爲現在$ file將存儲由於while循環而導致的最後一條記錄的文件路徑。
  3. 如果以上可行,並且下載代碼位於另一個.php文件中,那麼如何將相應的$ file變量值傳遞給該.php文件才能使該方法正常工作。

在此先感謝您並感謝您的幫助。

回答

1

我已閱讀,下載的代碼應該是在另一個PHP文件這將在需要時調用

確實如此。從請求/響應角度的這個思考,你的PHP代碼基本上需要兩個不同類型的請求作出迴應:

  • 一種文件列表請求
  • 一個特定文件
請求

這兩件事將在兩個不同的PHP文件。假設第一個被稱爲list.php。它只會顯示文件列表的HTML內容。它可能是一樣簡單的,你有什麼:

while ($row = mysql_fetch_array($result)) { 
    $ID =$row['logID']; 
    $date =$row['logDate']; 
    $file =$row['fileLink']; 

    echo $ID, ' '; 
    echo $date, '<br/>'; 
} 

你提到你想要的日期是超鏈接,是否正確?然後用超鏈接標記包圍它。像這樣:

echo '<a href="download.php?id=' . $ID . '">' . $date . '</a>', '<br />'; 

注意我在這裏做了幾件事。不僅是現在的超鏈接包圍日期值,但超鏈接包含幾個部分組成:

  • download.php,其中我將承擔爲第二頁的名稱。當然,它可以是你決定的任何東西。
  • $ID,這是發送到第二頁的值,以便它知道哪個文檔被點擊。這是URL上的查詢字符串值,將在第二頁上獲得$_GET['id']。注意:此值可以由用戶更改,不要依賴它作爲安全措施。始終驗證用戶是否有權下載他們在第二頁上請求的文件。

第二頁download.php將包括您將文件寫入輸出的代碼。標題信息,文件內容等。在該頁面中,您將獲得所請求文件的標識($_GET['id']),從數據庫或文件系統或其任何位置獲取該文件,並將其發送給用戶用你的代碼。

通過這種方式,用戶可以看到第一個頁面,然後可以點擊他們想要向第二個頁面發送他們想要的文件的任何鏈接。

+0

嗨大衛,謝謝你的詳細解釋。這真的很有幫助。它確實有效,但是有一個小問題。截至目前的顯示是我上面用超鏈接所說的。當我選擇我的最後一個下載文件「2014-01-27 09:38:09」時,下載彈出窗口完美工作。但是,當我選擇其他2條記錄時,它將加載download.php頁面,文本分別顯示C \:wamp \ www \ SCS \ Logs \ 2014-01-25.txt或26.txt。無論如何解決這個問題?再一次感謝你。 – Jethro

+0

@Jethro:聽起來好像是這些文件實際包含的內容,或者你的代碼沒有正確讀取文件,而只是迴應文件的名稱而不是內容。我不確定是什麼原因導致了這種情況(我的PHP非常生疏),但爲了診斷它,您可能需要在'download.php'中放入一些日誌語句來獲取一些運行時調試信息。基本上要確保每個值都是你期望的值。 – David

+0

嗨大衛,道歉,請忽略我的第一條評論。它正在工作完美,因爲我剛剛創建了另一個日誌文件進行測試。我認爲前兩個日誌文件下載發生的問題是由於我在MySQL中手動輸入了文件路徑,而這些文件路徑沒有正確地轉義並讀取目錄斜槓「\」。非常感謝你的幫助! – Jethro

0

根據您的問題1和2:

while ($row = mysql_fetch_array($result)) { 
    $ID =$row['logID']; 
    $date =$row['logDate']; 
    $file =$row['fileLink']; 
    echo $ID, ' '; 
    echo '<a href="'.$file.'">'.$date.'</a><br/>'; // Hyperlink to file. 
} 

而對於第三個問題,你可以嘗試

while ($row = mysql_fetch_array($result)) { 
     $ID =$row['logID']; 
     $date =$row['logDate']; 
     $file =$row['fileLink']; 
     echo $ID, ' '; 
     echo '<a href="yourfile.php?file='.$file.'">'.$date.'</a><br/>'; 
    } 
0

據我所知,你想有多個鏈接,將提供該特定日期的日誌文件。

你應該有一個文件,將準備日誌文件的列表作爲一個數組或在你的while循環請執行以下操作:

echo "<a href='download.php?logId={$row['logID']}'>{$row['logDate']}</a>"; 

那麼你應該創建的download.php(您的下載腳本,你已經已準備好)將基於logId GET參數(對數據庫的另一個查詢獲得filePath)提供文件。

相關問題