PHP文件上傳——純粹使用PHP以及藉助Zend框架

在PHP中最通用和簡單的文件上傳方式便是通過表單提交數據,本文提供純粹使用php腳本文件處理表單文件上傳以及藉助Zend框架處理表單文件上傳。

(1)通過php.ini 配置php以配合文件上傳,一些常見指令如下:

file_uploads:啓用或關閉PHP的文件上載功能。默認情形下會被啓用,即設置爲:ON;

upload_max_filesize:定義上載文件的最大尺寸。在默認情形下被設置爲2M;

upload_tmp_dir:定義了PHP臨時存儲上傳文件的目錄,被上傳的文件會臨時存放於服務器的該路徑下,可以由開發人員指定。在Xmapp中,該路徑是/xmapp/tmp;

post_max_size:設定POST 數據所允許的最大大小。默認設置爲2M。

max_execution_time:定義了PHP腳本的執行時間,默認爲30秒。因此對於尺寸較大,需要較長時間才能傳輸到服務器的文件來說,可以考慮其設置爲較大的值。

(2)在前端html文件中創建文件上傳的表單

       無論是在Zend框架中,還是普通的使用PHP的腳本文件,表單的設計基本上沒有區別,只是在使用Zend Framework時,可以不用爲form表單設置Action屬性,框架會自動將表單提交到對應的Action();在不使用Zend框架的情況下,需要爲表單設定Action屬性值,即要提交的到php文件。

如下便是簡單的文件上傳的表單程序片段,在zend框架下,第一行可以被

<form enctype="multipart/form-data" method="post"> 

替代。

<form enctype="multipart/form-data" method="post" action="/admin/upload.php"> 
	<p> 
 		Select File<br /> 
		<input type="file" name="file" id = "file" size="40" /> 
	</p>
	<p> 
		<input type="submit" name="submit" class="submit" value="Upload Video" /> 
	</p> 
</form>


其中表單屬性中的enctype屬性指定表單上傳時的編碼方式,該程序片段中使用的multipart/form-data是指不對錶單進行編碼,在表單中有文件上傳時必須使用該屬性;
file類型的input輸入框用來在客戶端文件系統中選擇特定的文件進行上傳;
之後提交類型的input輸入框在點擊時提交表單自動將表單提交到對應的php腳本文件(Action指定)或者對應控制器下的對應Action(Zend框架)。

(3)使用普通的php文件處理通過表單提交的文件:
使用php的全局數組$_FILES來實現對上傳文件的處理
具體見:點擊打開鏈接
有以下幾點需要注意:
      A、使用$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼,常見的情況包括:
UPLOAD_ERR_OK :值:0; 沒有錯誤發生,文件上傳成功。 
UPLOAD_ERR_INI_SIZE :值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。 
UPLOAD_ERR_FORM_SIZE 值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。 
UPLOAD_ERR_PARTIAL 值:3; 文件只有部分被上傳。 
UPLOAD_ERR_NO_FILE 值:4; 沒有文件被上傳。  值:5; 上傳文件大小爲0. 
B、該文件被保存在臨時文件夾中,如果在對應的腳本文件中不進行處理,在離開腳本時該臨時文件會被刪除
C、最基本的處理方式是經過一些列的檢查之後,將該文件使用move_uploaded_file()將文件轉移到特定的文件夾,具體見:點擊打開鏈接

(4)使用Zend框架處理表單提交的文件:
如下是最基本的處理上傳文件的代碼片段:

if ($this->getRequest()->isPost()) {  
      
       $upload = new Zend_File_Transfer_Adapter_Http();  
        
       $upload->setDestination($dir);  
            
       if ($upload->receive()) {   
         echo "The file has been uploaded!";  
       }  
}

其中首先調用Zend_File_Transfer類組件的處理通過表單提交數據的適配器;
之後設置文件的最終上傳地址,直接傳出一個dir地址即可;
通過適配器->receive() 接收文件;
同時可以爲適配器添加addValidator來對上傳進行一定和設置,或者添加addFilter實現對文件的重命名
同時可以使用getFileInfo()獲取上傳文件的信息


	$adapter = new Zend_File_Transfer_Adapter_Http();
    	$adapter->setDestination($dir);//設置上傳文件的目的路徑
    	$adapter->addValidator('Extension',false,'gif,jpeg,png');//設置上傳文件的後綴名
        $adapter->addValidator('Count',false,array('min'=>1,'max'=>5));//設置上傳文件的個數
   	$adapter->addValidator('ImageSize',false,array('minwidth'=>0,   'maxwidth'=>1300,'minhight'=>0, 'maxhight'=>1300));//設置上傳圖片的大小
	$adapter->addValidator('FilesSize',false,array('min'=>'10KB','max'=>'1024KB'));//設置上傳文件的大小
	$fileInfo = $upload->getFileInfo();//獲取文件信息
        foreach ( $fileInfo as $file=>$info ){
            if( $upload->isValid($file) ){//檢查是否合法
            	echo $file.'<br/>';
		//添加過濾器來修改上傳文件的名稱
 		$upload->addFilter('Rename',array('target'=>time().mb_convert_encoding($info['name'],'gbk','utf-8'),'overwrite'=>true),$file); 
		$upload->receive($file); 
	}else
	{ //對不能上傳的文件刪除錯誤信息 
	echo $upload->getMessages(); 
	} 
	}


發佈了38 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章