2010-09-08 57 views
1

我有一個窗體,我正在使用接收上傳的.csv文件,解析它並將數據插入到我的MySQL數據庫在Apache服務器上。該頁面首先檢查是否有上傳的文件。如果有,則處理數據,否則顯示錶格(如下)。取消設置上傳的文件在PHP

<form enctype="multipart/form-data" action="uploadfaculty.php" method="POST" id="UploadForm"> 
Choose a file to upload: <input name="uploadedfile" type="file" /><br /> 
<input type="submit" value="Upload File" /> 
</form> 

我的問題是,目前用戶可以簡單的F5瀏覽一遍又一遍,並因爲該文件仍然是服務器和$ _FILES數組中,它的每一次處理它。

我已經試過:
unlink($_FILES['uploadedfile']['tmp_name'])unlink($_FILES['uploadedfile'])unset($_FILES['uploadedfile']['tmp_name'])

unset($_FILES['uploadedfile'])` 

我甚至重置通過JavaScript(我知道是行不通的,但確實它的形式只是爲了消除所有疑問)。一切都無濟於事。我確定這是簡單的我錯過了...它幾乎總是。有什麼想法嗎?

回答

4

這並不是不安定的,因爲後期操作存儲在瀏覽器的末尾,並且當它們碰到F5時被重新上傳(在一小段時間內,因爲它只是一個csv)。這與使用表單上傳另一個csv的方式基本相同。

你可以這樣做:

if (isset($_POST['csv'])){ 
$DataProcessed = DataProcessingFunction(); 
} 

if (isset($DataProcessed) && $DataProcessed){ 
    header("Location: /path/to/form/page.php"); 
    exit(); 
} 

這將清除較早的請求發送POST數據。刷新不會重新提交表單。

+0

完美。那樣做了。 – d2burke 2010-09-08 20:31:36

3

您可以將header重定向到處理後的上傳頁面,以防止發佈數據通過刷新不斷進入。但是,處理完成後應該清除臨時文件。除非您使用move_uploaded_file函數,否則PHP不會保留該文件。

+0

你的意思是「臨時文件在處理完成後應該被清除」是什麼意思?你的意思是說,一旦我的腳本運行其過程,我fclose($句柄)它應該消失?如果是這樣的話,那麼如果我可以刷新我的瀏覽器並且可以找到,解析並重新插入數據,那麼其他的東西一定會發生。這裏是一個測試頁面: http://studentorg.ecpi.edu/oswm/uploadcsv.php – d2burke 2010-09-08 20:19:50

+0

'header(「location:thankyou.php」)'雖然是一個很好的例子,但我並不需要那是否有另一種方法。 – d2burke 2010-09-08 20:20:44

+0

$ _FILES數組未由用戶使用以前的請求上傳的文件填充。如果他們擊中F5並刷新,則每次都會上傳文件。您需要將它們發送到其他頁面以防止請求被重新提交。儘管如此,這並不妨礙他們的使用。 – Inigoesdr 2010-09-08 20:23:34