2011-11-17 81 views
0

我正在基於用戶數據創建文件(從數據庫表中讀取數據,寫入csv文件,存儲在服務器上,然後打印出用戶的鏈接(登錄)下載)。只允許特定用戶從服務器上下載文件

如何確保只有用戶可以下載該文件?例如,如果文件存儲在http://mysite.com/username/file,我怎樣才能確保只有該用戶在登錄時纔是唯一可以下載文件的用戶?使用PHP。

感謝您的幫助

回答

2

PHP手冊有一個用戶提交的條目已經做了你在找什麼:

function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) { 

    if($attachment) { 
     // send response headers to the browser 
     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment;filename='.$filename); 
     $fp = fopen('php://output', 'w'); 
    } else { 
     $fp = fopen($filename, 'w'); 
    } 

    $result = mysql_query($query, $db_conn) or die(mysql_error($db_conn)); 

    if($headers) { 
     // output header row (if at least one row exists) 
     $row = mysql_fetch_assoc($result); 
     if($row) { 
      fputcsv($fp, array_keys($row)); 
      // reset pointer back to beginning 
      mysql_data_seek($result, 0); 
     } 
    } 

    while($row = mysql_fetch_assoc($result)) { 
     fputcsv($fp, $row); 
    } 

    fclose($fp); 
} 

// Using the function 
$sql = "SELECT * FROM table"; 
// $db_conn should be a valid db handle 

// output as an attachment 
query_to_csv($db_conn, $sql, "test.csv", true); 

// output to file system 
query_to_csv($db_conn, $sql, "test.csv", false); 
1

我正要編輯您的問題,並刪除SQL和CSV標籤,因爲,作爲問,它並沒有真正與這些題目做。但是,我的答案是。

而不是將文件保存到文件系統,只需生成csv文件直接輸出到響應。您的代碼只會爲用戶生成正確的csv(或者不爲非用戶提供內容),從而解決問題。

這假定文件的生成適度輕量級,並且不會非常頻繁地完成。

+0

感謝您的答覆。但是,我並不熟悉如何生成用戶可以下載爲csv文件的輸出。你能給我一個小費嗎? – Andrew

+0

將csv輸出到文件中後,您可以在設置內容類型標題後將其輸出到響應中。 –

0

如果用戶未登錄,或者用戶名錯誤,只顯示消息或重定向或您想要的任何內容,而不是授予對文件的訪問權限。你所展示的url例子應該只是一個帶有鏈接或重定向到真實文件的頁面。你甚至可以生成一個文件名哈希值來提高安全性。

0

不幸的是,你需要在一些代碼中包裝下載。您可以使用類似的技術:

if ($user->is_correct_user_with_access()) 
{ 
    header('Content-Type: application/octet-stream'); // this can be replaced with whatever file format you want; 

    echo file_get_contents($local_path_to_file); 
    die; 
} 

還要確保您正在生成的文件不在可公開訪問的路徑(即,它應該是你的文檔根目錄下)

0

你可以創建一個名爲download.php文件,例如:

if($logged_in && $username == $_GET['download_username']) { 

    header("Content-Type: application/force-download"); 
    header('Content-Disposition: attachment; filename=nameofdownload.zip'); 
    readfile('downloads/' . $_GET['download_username'] . '/file.zip'); 

} 

然後在downloads文件夾,你可以創建一個.htaccess文件,並把以下內容:

Deny from all 
0

聽起來像一個微不足道的問題......有多種方式,如果用戶登錄,然後只是檢查他們請求的文件屬於他們。

這樣做的最好方法可能是使用傳遞文件。例如,對/username/file的請求實際上會調用/download.php?id=username&dl=file,然後您可以檢查登錄的用戶是否等於id或試圖從中下載的文件的用戶名,如果匹配,則使用php標頭位置將請求重定向到儘管可以通過查看標題來利用另一個位置;所以爲了使它看起來沒什麼問題,你可以將文件存儲在web目錄之外,並使用php讀取文件並將其直接輸出到瀏覽器。

相關問題