最近一段時間對PHP檔案處理方面很感愛好,因此在許多網站上看了許多的檔案處理的文章,但是國內許多的網站上的PHP檔案處理方面的知識大多數是你抄我的我抄你的,用baidu.com或者是google.com搜尋出來的東西多是重複的。最近在國外一個網站上盾了一篇文章感覺很不錯,因此推薦給大家閱讀。
首先我們有必要說明一下檔案上傳的操作流程及用到的知識點:
檔案上傳我們需要用到HTML裡面表單的type="file"類型,及其enctype屬性。這是我們大家必須要用的。當然了PHP函數庫當中的FILE函數庫,字串類型函數庫,目錄函式庫及$_FILES[]的使用是我們必須要用到的。
也許每一個網站都可能會對上傳檔案有許多的限制,這些限制會包括 檔案類型,檔案大小,副檔名,以及上傳目錄的存在與否,上傳檔案的存在與否,目錄的可寫性,可讀性,上傳檔案的改名及怎樣把檔案從緩衝當中複製到你所需要的目錄當中。
當然出錯的預先處理也是我們不容忽視的!假如再深一步的討論我們還可以對檔案的操作起用事件記錄的記錄。
下面我們通過一段程式來實現這些功能:
--------------------------------------------------------------------------------------------
首先是我們預設的變數值,它包括檔案大小,副檔名類型,MIMI類型,及是否刪除的開關變數
$MAX_SIZE = 2000000;
$FILE_MIMES = array('image/jpeg','image/jpg','image/gif'
,'image/png','application/msword');
$FILE_EXTS = array('.zip','.jpg','.png','.gif');
$DELETABLE = true;
下一部就是設定瀏覽器訪問變數及目錄訪問變數:
$site_name = $_SERVER['HTTP_HOST'];
$url_dir = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
$url_this = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$upload_dir = "files/";
$upload_url = $url_dir."/files/";
$message ="";
建立上傳目錄並相應改變許可權:
if (!is_dir("files")) {
if (!mkdir($upload_dir))
die ("upload_files directory doesn't exist and creation failed");
if (!chmod($upload_dir,0755))
die ("change permission to 755 failed.");
}
使用者請求的處理:
if ($_REQUEST[del] && $DELETABLE) {
$resource = fopen("log.txt","a");
fwrite($resource,date("Ymd h:i:s")."DELETE - $_SERVER[REMOTE_ADDR]"."$_REQUEST[del]n");
fclose($resource);
if (strpos($_REQUEST[del],"/.")>0); //possible hacking
else if (strpos($_REQUEST[del],"files/") === false); //possible hacking
else if (substr($_REQUEST[del],0,6)=="files/") {
unlink($_REQUEST[del]);
print "<script>window.location.href='$url_this?message=deleted successfully'</script>";
}
}
else if ($_FILES['userfile']) {
$resource = fopen("log.txt","a");
fwrite($resource,date("Ymd h:i:s")."UPLOAD - $_SERVER[REMOTE_ADDR]"
.$_FILES['userfile']['name']." "
.$_FILES['userfile']['type']."n");
fclose($resource);
$file_type = $_FILES['userfile']['type'];
$file_name = $_FILES['userfile']['name'];
$file_ext = strtolower(substr($file_name,strrpos($file_name,".")));
//檔案大小的檢查: