php實現文件上傳與下載(上)
php實現文件的上傳與下載是一個挺基本的功能,一般網站多多少少都會有這樣的需求在內,當然不是說所有的文件都可以被上傳,那這網絡就太沒有安全性可言了。因為接觸php時間不長,今天寫練練手,隨筆也就是公開記錄而已啦。
文件上傳:也就是將客戶端的文件上傳到服務器端,在將服務器端的臨時文件移動到指定目錄即可。主要思維就是先定義獲取$_FILES中的二維數組變量,可以每次都用二維數組獲取,也可以將第一維的放入一個數組變量中,然後每次獲取該數組變量中的值,簡化代碼量----> 判斷錯誤號是否為0或者是UPLOAD_ERR_OK為真時表示沒有錯誤,可以上傳----->將服務器上的臨時文件移動到我們的指定目錄下,叫什麼名字,移動成功返回true,用move_uploaded_file($臨時文件名,$目的地)----->另外一種方式就是用copy($臨時變量名,$目的地)函數;
$_FILES中保存這兒上傳文件的信息,這是一個二維數組,第一維當然就是上傳進來的文件的名稱了,第二維就是該文件的相關信息了,上傳之後就可以打印該數組中的參數進行查看---用print_r($_FILES),可以看到裡邊的內容有:
name:上傳文件的名稱;
type:上傳文件的MIME類型;
tmp_name:上傳到服務器上的臨時文件名;//很重要的,因為以後在服務器上操縱的就是這個文件
size:上傳文件的大小;
error:上傳文件的錯誤號,成功為0,。
服務器端配置---php.ini:
file_uploads=on,支持http上傳;
upload_tmp_dir=,臨時文件保存的目錄;
upload_max_filesize= 2M ;允許上傳文件的大小;
max_file_uploads=20; 允許一次上傳文件數目,默認為20;
max_execution_time=-1;設置腳本被解析終止之前允許的最大執行秒數,防止程序太差(例如死循環)而占盡服務器資源;
max_input_time=60;腳本解析輸入數據允許的最大秒數;
max_input_nesting_level=64,設置輸入變量的嵌套深度;
max_input_vars=60;接受多少輸入的變量,減輕dos攻擊的可能性,如果超過指定數量的變量,將會導致E_WARNING的產生,更多的輸入變量將會從請求中截斷;
memory_limit=128M。最大單線程的獨立內存使用量,也就是一個web請求,給予線程的最大內存使用量的定義。
還有一些錯誤信息說明,基本都是英文的字面意思,找不見臨時目錄啊大小超過限制啊之類的共8中錯誤信息,分別對應數字0-8但是沒有數字5,在代碼裡進行判定輸出,按照一一對應的,可以用switch……case,共7個case(0表示成功就不用寫了)來表示輸出錯誤信息。在代碼中進行判定,如果沒錯誤輸出的話,就進行上傳操作。
客戶端的一些配置---但是在客戶端的配置很多時候並不能真正起到限制作用,真正想限制都是要配置在服務端的:
通過表單隱藏域限制上傳文件的最大值 <input type="hidden" name="MAX_FILE_SIZE" value="字節數" />
通過accept屬性限制上傳文件類型 <input type="file" name="myFile" accept="文件的MIME類型" />
在這個練手的過程中,我沒有認識到一點,form表單最大上傳限制(程序中的判定)和底層php的判定(php.ini中),因此如果我表單的最大上傳限制為2M,而php.ini中的判定是10M,這樣在我上傳文件大小超過10M時肯定就直接提示代碼錯誤,而當上傳文件大小介於2M和10M之間時,程序可以執行,按照判定輸出對應的錯誤信息。