我正在基於用戶數據創建文件(從數據庫表中讀取數據,寫入csv文件,存儲在服務器上,然後打印出用戶的鏈接(登錄)下載)。只允許特定用戶從服務器上下載文件
如何確保只有用戶可以下載該文件?例如,如果文件存儲在http://mysite.com/username/file,我怎樣才能確保只有該用戶在登錄時纔是唯一可以下載文件的用戶?使用PHP。
感謝您的幫助
我正在基於用戶數據創建文件(從數據庫表中讀取數據,寫入csv文件,存儲在服務器上,然後打印出用戶的鏈接(登錄)下載)。只允許特定用戶從服務器上下載文件
如何確保只有用戶可以下載該文件?例如,如果文件存儲在http://mysite.com/username/file,我怎樣才能確保只有該用戶在登錄時纔是唯一可以下載文件的用戶?使用PHP。
感謝您的幫助
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);
我正要編輯您的問題,並刪除SQL和CSV標籤,因爲,作爲問,它並沒有真正與這些題目做。但是,我的答案是。
而不是將文件保存到文件系統,只需生成csv文件直接輸出到響應。您的代碼只會爲用戶生成正確的csv(或者不爲非用戶提供內容),從而解決問題。
這假定文件的生成適度輕量級,並且不會非常頻繁地完成。
如果用戶未登錄,或者用戶名錯誤,只顯示消息或重定向或您想要的任何內容,而不是授予對文件的訪問權限。你所展示的url例子應該只是一個帶有鏈接或重定向到真實文件的頁面。你甚至可以生成一個文件名哈希值來提高安全性。
不幸的是,你需要在一些代碼中包裝下載。您可以使用類似的技術:
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;
}
還要確保您正在生成的文件不在可公開訪問的路徑(即,它應該是你的文檔根目錄下)
你可以創建一個名爲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
聽起來像一個微不足道的問題......有多種方式,如果用戶登錄,然後只是檢查他們請求的文件屬於他們。
這樣做的最好方法可能是使用傳遞文件。例如,對/username/file
的請求實際上會調用/download.php?id=username&dl=file
,然後您可以檢查登錄的用戶是否等於id或試圖從中下載的文件的用戶名,如果匹配,則使用php標頭位置將請求重定向到儘管可以通過查看標題來利用另一個位置;所以爲了使它看起來沒什麼問題,你可以將文件存儲在web目錄之外,並使用php讀取文件並將其直接輸出到瀏覽器。
感謝您的答覆。但是,我並不熟悉如何生成用戶可以下載爲csv文件的輸出。你能給我一個小費嗎? – Andrew
將csv輸出到文件中後,您可以在設置內容類型標題後將其輸出到響應中。 –