標籤:
非ajax,非iframe,最原始使用file控制項的檔案上傳,記錄過程備忘。
實現目標,能夠將檔案上傳到指定位置。
用戶端用input的file控制項:
<form action=‘data.php‘ method=‘post‘ enctype=‘multipart/form-data‘> <input type=‘file‘ name=‘file‘ /> <input type=‘submit‘ /></form>
控制項的name屬性就是為了和伺服器端通訊用的。在選擇檔案後,我們可以嘗試看看file控制項的屬性(此時不要按submit按鈕),此時該控制項下的files就是檔案的一些資訊了:
接著按下sumbit按鈕提交檔案,form要正確提交以下幾個條件都不能少:
-
- 正確的action地址。後台我是用php寫的,一開始用的是絕對位址,一直出錯,原來忘了加http://
- method=‘post‘
- enctype=‘multipart/form-data‘
form檔案提交到後台後,可以用chrome-logger跟蹤一下檔案的樣子:
tmp_name就是所上傳檔案的臨時位置了,在form提交以後,伺服器會以臨時檔案的形式儲存上傳檔案。我們需要做的,只是把這個臨時檔案copy到伺服器目標檔案夾;同時檔案名稱不能使用原來的name,因為可能會和目標檔案夾下的重複,所以就要產生唯一的user_uid,這裡我簡單地rand了一個數字,複製檔案用了php內建的copy函數(函數的兩個參數都是路徑+檔案名稱的形式):
include ‘ChromePhp.php‘;ChromePhp::log($_FILES[‘file‘]); // for debug$user_uid = rand(0, 50000);$file_pos = strpos($_FILES[‘file‘][‘name‘], ‘.‘);$file_name = $user_uid . ‘.‘ . substr($_FILES[‘file‘][‘name‘], $file_pos + 1);$savePath = dirname(__FILE__) . ‘\\‘ . $file_name;copy($_FILES[‘file‘][‘tmp_name‘], $savePath);
最後還有個問題,如此這般後一直不能上傳7z、zip等格式的檔案,以為是不能傳壓縮檔,最後發現是php.ini檔案設定問題,找到php.ini檔案中的upload_max_filesize屬性,把值加大就可以了。在php中使用$_FILES的時候,如果出錯,可以嘗試列印錯誤編號自己解決,參考Error Messages Explained
參考: javascript,php檔案上傳詳解
JavaScript,php檔案上傳簡單實現