為大家深入介紹php檔案上傳的相關原理,有需要的朋友,可以參考下。
在許多的php 教學中,都會介紹檔案上傳,眾所周知,php檔案上傳是簡單而有效率的,今天為大家分析下其原理。 //使用multipart/form-data編碼格式 $_FILES系統函數; $_FILES['myFile']['name']檔案名稱 $_FILES['myFile']['type']檔案的類型,服務端進行限制 image/** image/x-png application/x-zip-compressed $_FILES['myFile']['size']上傳檔案大小 $_FILES['myFile']['tmp_name']上傳服務後儲存暫存檔案名 $_FILES['myFile']['error']錯誤代碼; 0成功1超過php.ini大小2超過MAX_FILE_SIZE選項指定的值 3只有部分上傳 5上傳檔案大小為0 move_uploaded_file(臨時文件,目標位置與文件名稱); 上傳後移動檔案到目標位置的函數 is_uploaded_file(MIME); 判斷上傳MIME類型的例子: 1、html部分 <form enctyoe="multipart/form-data" method="post" name="upload"> <input name="upfile" name="name"> </form> 2、檔案上傳程式碼 <?php if(is_uploaded_file($_FILES['myFile']['tmp_name'])){ $upfile = $_FILES['upload']; $name = $upfile['name']; $type = $upfile['type']; $size = $upfile['size']; $tmp_name = $upfile['tmp_name']; $error = $upfile['error']; switch($type){ case 'image/pjpeg' : $ok=1; break } if($ok){ move_uploaded_file($tmp_name,'up/'.$name); }else{ echo "不允许的文件类型"; } } ?> ------------------------------------------- PHP檔案上傳的原理及實作 一,表單 1,上傳檔案的表單使用post方式(和get的差異不用說了);還要加上enctype='multipart/form-data'。 2,一般要加上隱藏域:,位置在file域前面。 value的值是上傳檔案的客戶端位元組限制。據說可以減少文件超標時客戶端的等待時間,不過我沒覺得有什麼差別。 3,出於安全考慮,file域是不准賦值的。隨便在file域輸入字串,然後按submit也不會有反應。必須是第二個字元是冒號的時候(例如空格跟隨冒號可以上傳一個長度為0位元組的「檔案」),submit才同意「服務」-不過這個是客戶端的措施,跟MAX_FILE_SIZE一樣很容易繞過去。 二,檔案上傳錯誤代碼 先抄一段:預定義變數$_FILES陣列有5個內容: $_FILES['userfile']['name']——客戶端機器檔案的原名稱 $_FILES['userfile']['type']-檔案的 MIME 類型 $_FILES['userfile']['size']-已上傳檔案的大小,單位為位元組 $_FILES['userfile']['tmp_name']-檔案上傳後在服務端儲存的暫存檔案名 $_FILES['userfile']['error']——和該檔案上傳相關的錯誤代碼 其中$_FILES['userfile']['error']的可以有下列取值與意義: 0——沒有錯誤發生,文件上傳成功。 1——上傳的檔案超過了 php.ini 中 upload_max_filesize 選項限制的值。 2-上傳檔案的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。 3——文件只有部分被上傳。 4——沒有文件被上傳。 1~3不用說了。 「沒有檔案被上傳」(4)是指表單的file域沒有內容,是空字串。 「檔案上傳成功」(0)不一定真的有檔案上傳了。例如你打了個“c:”給file域,就可以“上傳成功”——錯誤代碼是0,['name']是“c:”,['type']是“application/octet-stream” ,['size']是0,['tmp_name']是「xxx.tmp」(xxx是伺服器取的名字) 三,檔案大小限制和檢驗 限制上傳檔案大小的因素有 1,客戶端的隱藏域MAX_FILE_SIZE的數值(可以被繞開)。 2,伺服器端的upload_max_filesize,post_max_size和memory_limit。這幾項不能夠用腳本來設定。 3,自訂檔案大小限制邏輯。即使伺服器的限制是能自己決定,也會有需要個別考慮的情況。所以這個限制方式經常是必要的。 我碰見的一種情況可能不是普遍性的,說明一下。如果檔案比伺服器端限制(upload_max_filesize)大很多,但也還沒達到或接近post_max_size或memory_limit,$_FILES就會“崩潰”——結果是$_FILES['userfile']變成了“Undefined index”,當然是什麼檢驗也做不到了。 伺服器端限制的檢定優先於客戶端限制的檢定。就是說,如果兩個限制是一樣的,而檔案過大了,$_FILES['userfile']['error']會出錯誤代碼1。只有客戶端限制比伺服器端限制小到一定“程度”,而且檔案大小超過兩者的時候,才會出現錯誤代碼2(難道這跟我感覺MAX_FILE_SIZE沒起到預想的作用是一個原因?)。上述的“程度”,在我的機器上試驗在3~4K之間——我的機器設定的伺服器端限制為2M……因為沒什麼意味,就沒有追求精確的規律。 出現錯誤代碼1或2的時候: $_FILES['userfile']['name']為客戶端機器檔案的原名稱 $_FILES['userfile']['type']為空字串 $_FILES['userfile']['size']為0 $_FILES['userfile']['tmp_name']為空字串 四,文件路径检验 file域无输入,错误代码为4(无文件上传) $_FILES['userfile']['name']为空字符串 $_FILES['userfile']['type']为空字符串 $_FILES['userfile']['size']为0 $_FILES['userfile']['tmp_name']为空字符串 file域是非文件路径的字符串(不考虑客户端的假“限制”了),错误代码是0(“上传成功”) $_FILES['userfile']['name']为原字符串 $_FILES['userfile']['type']为application/octet-stream $_FILES['userfile']['size']为0 $_FILES['userfile']['tmp_name']为一个暂时文件名 五,is_uploaded_file()的返回值 手册上面不很详细地说,用法是: bool is_uploaded_file( string filename) 实际上 is_uploaded_file($_FILES['userfile']['name']); 总是返回FALSE。后来看见别人是用: is_uploaded_file($_FILES['userfile']['tmp_name']); 比较一下: file域无输入——————返回FALSE——error=>4,name=>'', tmp_name=>'', type=>'', size=>0 file域为非路径字符串——返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>0 文件上传成功——————返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>sss 文件太大————————返回FALSE——error=>1,name=>'xxx',tmp_name=>'', type=>'', size=>0 文件太大————————返回FALSE——error=>2,name=>'xxx',tmp_name=>'', type=>'', size=>0 文件部分上传——————没机会试验 —error=>3 有点怀疑这个函数是怎么工作的,还是觉得用$_FILES['userfile']['size']检验好些。 六,检验顺序 if($_FILES['userfile']['error']!=4){//有文件上传 if($_FILES['userfile']['error']!=3){//全部上传了 if($_FILES['userfile']['error']!=1){//不超过服务器端文件大小限制 if($_FILES['userfile']['error']!=2){//不超过客户端文件大小限制 if($_FILES['userfile']['size']>0){//确实是文件 if(......){//自定义文件大小检验逻辑 if(......){//自定义文件类型检验逻辑 if(move_uploaded_file($_FILES['userfile']['tmp_name'],...))//移动文件 //.......... } else give_a_message(...); } else give_a_message(...); } else give_a_message(...); } else give_a_message(...); } else give_a_message(...); } else give_a_message(...); } else give_a_message(...); } 附代码: ------------------------------ 1)、test.php: <html> <body> <form enctype="multipart/form-data" action="upload.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> Send this file: <input name="userfile" type="file" accept="image/x-png,image/gif,image/jpeg"/> <input type="submit" value="Send File" /> </form> </body> </html> 2)、upload.php <html> <body> <?php $uploaddir = 'images/'; $uploadfile = $uploaddir. $_FILES['userfile']['name']; print "<pre class="brush:php;toolbar:false">"; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { print "File is valid, and was successfully uploaded. Here's some more debugging info:\n"; print_r($_FILES); } else { print "Possible file upload attack! Here's some debugging info:\n"; print_r($_FILES); } print ""; ?> |

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具