2011-07-09 50 views
1

我用PHP生成* .csv文件,效果很好。問題是,它包含一堆敏感數據。我已經非常仔細地完成了我的權限,所以如果不是正確的用戶,就無法進入下載鏈接或生成文件。 我碰到的問題是,在用戶下載文件後,文件需要立即刪除。機會是很小的,我知道,有人會坐在那裏掃描我的網站結構,但數據是足夠重要的地方,我想包括我的屁股:-)如何下載,然後用PHP刪除我的網站上的文件?

我有這個起初:

<a href="<?php echo base_path().$ourFileName ?>"><?=$ourFileName?></a> 

這對於下載文件非常有用,但我很難用它做任何類型的動作,因爲如果您將PHP代碼嵌入到OnClick =「」中,它將在點擊發生之前執行,因爲所有PHP代碼在處理HTML和JAVASCRIPT之前呈現在服務器端......對嗎?我搜索了互聯網,它似乎沒有得到JavaScript來讓燙髮刪除文件......不過,我可能是錯的。

所以我把我的鏈接到一個表格:

<?PHP 
if(isset($_POST['submit'])) 
{ 
    header("Location: ".base_path().$ourFileName); 
    unlink(base_path().$ourFileName); 
}?> 

<form action="<? $PHP_SELF ?>" method="post"> 
<input type="submit" value="Submit" name="submit"> 
</form> 

但很明顯,取消鏈接()將永遠不會到達,因爲頭的......至少我覺得... 有另一種方式除了header()將文件下載到它們? 我知道我可以只運行一個cron作業每分鐘或東西,只是:

rm -rf *.csv 

而且,將採取這一問題的關心,但是如果用戶在下載文件和cron啓動的過程中會發生什麼跑步?或者頁面已生成,但由於某種原因,它們不會點擊鏈接一段時間?

也許有一些方法來配置我的.htaccess文件,所以你只能訪問該文件,如果從一個頁面鏈接?

我是否過分複雜呢?

interweb的任何創意大師?

--edit 每受歡迎的建議下,我工作的新報頭格式,使代碼看起來是這樣的:

<?PHP if(isset($_POST['submit']) && ($user->uid)) 
{ 
    myroom_render_csv($ourFileName, $csv_string); 
}?> 

<form action="<? $PHP_SELF ?>" method="post"> 
<input type="submit" value="Submit" name="submit"> 
</form> 

並在一個單獨的文件:

<?PHP function myroom_render_csv($file_name, $csv_string) { 
header('Content-type: text/csv'); 
$header_string2="Content-Disposition: attachment; filename=\"".$file_name."\""; 
header($header_string2); 
echo $csv_string; 
} ?> 

,但我獲取完整HTML頁面和CSV數據的轉儲。想法?

回答

5

這是一個更簡單的解決方案 - 不要創建文件。相反,你的數據寫入.csv文件,只需設置標題在PHP腳本像這樣:在PHP腳本

header('Content-type: text/csv'); 
header('Content-Disposition: attachment; filename="whatever.csv"'); 

echo $csv_data; 

打印出你的CSV數據,瀏覽器會像對待一個文件下載。這樣,您就可以自由地控制文件訪問的對象和時間。

+0

請注意,「text/csv」的行爲並不像您期望的那樣普遍。我實際上並不記得它是以什麼方式圍繞它,而是ISTR,例如FF或IE以某種意想不到的方式行事,除非CSV數據以「text/plain」形式呈現。或者可能是'application/csv'。在多個瀏覽器中查看最適合您的內容。 –

+0

如果數據量非常大(如果你問我的話,增加單個腳本的內存限制是一個壞主意),那麼轉儲完整變量可能會有問題 更好的方法是寫入'php:// out'與PHP 5.1 +你有[fputcsv](http://es.php.net/fputcsv),它爲你做的大部分工作 – rmontagud

+0

我一直在努力實現你的功能的想法,我知道我必須做的有些愚蠢,因爲我無法得到它。 我很好地獲得了CSV數據,它的格式非常正確,但我也獲得了HTML頁面的完整轉儲。 應該如何調用? – TopherGopher

1

有幾點意見。


偉大的工程剛剛下載的文件, 但我有一個很難做任何 一種與它的行動,因爲如果 你一個onclick =「」 這裏面嵌套的PHP代碼將在點擊 發生之前執行,因爲在處理HTML 和JAVASCRIPT之前,所有PHP代碼都是 呈現的服務器端...對嗎?我 搜索了互聯網,它並沒有 似乎我可以得到JavaScript的 有燙髮刪除 文件...坦率地說,我可能是很錯誤的 錯誤。

你是絕對正確的。


我產生PHP和 * .csv文件它的偉大工程。問題是,它 包含一堆敏感數據。 我已經仔細地完成了我的權限 ,因此您無法訪問 下載鏈接或生成文件 而不是正確的用戶。我遇到的 問題,是用戶下載文件後右邊 , 文件需要立即刪除。 的機會是很小的,我知道,那 會有人坐在那裏 掃描我的網站結構,但 數據的地方,我想 覆蓋我的屁股:-)

那麼爲什麼如此重要它是一個文件?只需將它發送到瀏覽器並使用相關標題來提示瀏覽器將其作爲可保存文件資源呈現給用戶即可。它不必是網絡服務器上的物理文件。

其他人爲此提供了代碼;我只是想指出你對客戶端/服務器端的角度是正確的。 :)


但很明顯,取消鏈接()將永遠不會到達,因爲頭

。實際上,沒有。 header不會停止腳本。

header("Location: ".base_path().$ourFileName); 
unlink(base_path().$ourFileName); 

unlink將已經執行,完成很久以前的瀏覽器已經得到了各地甚至開始base_path().$ourFileName請求。

通常,雖然,你應該寫exitheader後停止代碼處理:

header("Location: ".base_path().$ourFileName); 
exit; 
unlink(base_path().$ourFileName); 

而現在,就像你說的,是的,unlink永遠不會發生。

+0

感謝您的澄清。我甚至沒有考慮過使用標題,因爲我以前從來沒有這樣做過,但是...非常好......這似乎比我的想法更安全。我將開始在頭文件shenanigans上搜索,如果你有一個你會推薦的資源,我很樂意聽到它。 – TopherGopher

+0

@chrisbster:你想要一個資源?看Sam的回答。 :) –

+0

是的,我剛剛看到。 :-) 謝謝互聯網! – TopherGopher

相關問題