本篇文章為大家介紹一下PHP多檔案上傳實作格式化的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
推薦:《2021年PHP面試題大匯總(收藏)》《php影片教學》
檔案上傳是所有web應用程式中最常見的功能,而PHP實作這項功能也非常的簡單,只需要前端設定表單的enctype 值為multipart/form-data 之後,我們就可以透過$_FILES 取得表單中的file 控制項中的內容。
同時,我們也可以將 file 控制項的名稱寫成帶有 [] 的陣列形式,這樣我們就可以接收到多個上傳的檔案。例如下面這個測試用的表單:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="" enctype="multipart/form-data" method="post"> myfile1:<input type="file" name="myfile[]"/><br/> myfile2:<input type="file" name="myfile[a][]"/><br/> myfile3:<input type="file" name="myfile[a][b][]"/><br/> myfile4:<input type="file" name="myfile[c][]"/><br/> myfile5:<input type="file" name="myfile[]"/><br/> myfile6:<input type="file" name="myfile[][]"/><br/> <br/> newfile1:<input type="file" name="newfile[][]"/><br/> newfile2:<input type="file" name="newfile[s]"/><br/> singlefile: <input type="file" name="singlefile"/><br/> <input type="submit" value="submit"/> </form> </body> </html>
一共有9個 file 控件,其中 myfile 和 newfile 都是數組類型的表單名,而 singlefile 則是一個單獨的。先簡單的看一下 $_FILES 所獲得的內容。
print_r($_FILES); Array ( [myfile] => Array ( [name] => Array ( [0] => 2591d8b3eee018a0a84f671933ab6c74.png [a] => Array ( [0] => 12711584942474_.pic_hd 1.jpg [b] => Array ( [0] => 12721584942474_.pic_hd 1.jpg ) ) [c] => Array ( [0] => 12731584942474_.pic_hd.jpg ) [1] => background1.jpg [2] => Array ( [0] => adliu_pip_data.xlsx ) ) [type] => Array ( [0] => image/png [a] => Array ( [0] => image/jpeg [b] => Array ( [0] => image/jpeg ) ) [c] => Array ( [0] => image/jpeg ) [1] => image/jpeg [2] => Array ( [0] => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ) ) [tmp_name] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phphD88ZY [a] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpNY8MzY [b] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/php3MX5tk ) ) [c] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpjgrHMj ) [1] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phppXRtnc [2] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpekSY1M ) ) [error] => Array ( [0] => 0 [a] => Array ( [0] => 0 [b] => Array ( [0] => 0 ) ) [c] => Array ( [0] => 0 ) [1] => 0 [2] => Array ( [0] => 0 ) ) [size] => Array ( [0] => 4973 [a] => Array ( [0] => 3007 [b] => Array ( [0] => 1156 ) ) [c] => Array ( [0] => 6068 ) [1] => 393194 [2] => Array ( [0] => 36714 ) ) ) [newfile] => Array ( [name] => Array ( [0] => Array ( [0] => 数据列表 (2).xlsx ) [s] => background1.jpg ) [type] => Array ( [0] => Array ( [0] => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ) [s] => image/jpeg ) [tmp_name] => Array ( [0] => Array ( [0] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phplSsRfM ) [s] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpuQAvRb ) [error] => Array ( [0] => Array ( [0] => 0 ) [s] => 0 ) [size] => Array ( [0] => Array ( [0] => 77032 ) [s] => 393194 ) ) [singlefile] => Array ( [name] => timg (8).jpeg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpxtSQ4J [error] => 0 [size] => 10273 ) )
看出有什麼問題了嗎?
$_FILE['singlefile']['name']; $_FILE['singlefile']['type']; $_FILE['singlefile']['tmp_name']; $_FILE['singlefile']['error']; $_FILE['singlefile']['error']; $_FILE['myfile']['name']['a']['b'][0]; $_FILE['myfile']['type']['a']['b'][0]; $_FILE['myfile']['tmp_name']['a']['b'][0]; $_FILE['myfile']['error']['a']['b'][0]; $_FILE['myfile']['error']['a']['b'][0];
單一表單是一個 singlefile 為鍵名的數組,裡面是對應的 name 、 type 等屬性。這個非常簡單也清晰明了,但是數組形式上傳的內容就比較坑了,每一個屬性下面都有多個值,而且這些值還有可能是嵌套的數組。
就比如說我們要取得myfile[a][b][] 的上傳檔案內容,我們就要透過\$_FILE['myfile']['name']['a'][' b'][0] 、 $_FILE['myfile']['type']['a']['b'][0] 這樣的形式獲得相關的內容。
這個可真的不是很友好,那麼我們今天的主題就來了,我們把這種內容進行一下格式化,讓他變成和singlefile 類似的結構,也就是一個文件的相關內容都在一個鍵名結構下,例如myfile[a][b][] 的內容就全部都在$_FILE['myfile'][a][b][0]下面。
$files = []; // 开始数据格式化 foreach ($_FILES as $uploadKey => $uploadFiles) { // 需要将 $_FILES 中的五个字段都拿出来 $files[$uploadKey] = formatUploadFiles($uploadFiles['name'], $uploadFiles['type'], $uploadFiles['tmp_name'], $uploadFiles['error'], $uploadFiles['size']); } // 格式化上传文件数组 function formatUploadFiles($fileNamesArray, $type, $tmp_name, $error, $size) { $tmpFiles = []; // 文件名是否是数组,如果不是数组,就是单个文件上传 if (is_array($fileNamesArray)) { // 数组形式上传 foreach ($fileNamesArray as $idx => $fileName) { // 如果还是嵌套的数组,递归遍历接下来的内容 if (is_array($fileName)) { $tmpFiles[$idx] = formatUploadFiles($fileName, $type[$idx] ?? [], $tmp_name[$idx] ?? [], $error[$idx] ?? [], $size[$idx] ?? []); } else { // 组合多维的格式化内容 $tmpFiles[$idx] = [ 'name' => $fileName, 'type' => $type[$idx] ?? '', 'tmp_name' => $tmp_name[$idx] ?? '', 'error' => $error[$idx] ?? '', 'size' => $size[$idx] ?? '', ]; } } } else { // 组合单个的内容 $tmpFiles = [ 'name' => $fileName, 'type' => $type ?? '', 'tmp_name' => $tmp_name ?? '', 'error' => $error ?? '', 'size' => $size ?? '', ]; } return $tmpFiles; } print_r($files);
程式碼還是非常好理解的,就是透過一段遞歸來遍歷整個 $_FILES 目錄樹,相當於一個深度遍歷。當然,這樣也會帶來效能的下降,畢竟是需要進行循環 遞歸的遍歷。不過好在大部分情況下我們上傳的檔案並不會那麼多的多。不過反過來說,如果不事先進行格式化,當你想獲得所有的上傳內容時,一樣還是需要進行多層或者遞歸遍歷的。
接下來我們來看看格式化之後的輸出:
Array ( [myfile] => Array ( [0] => Array ( [name] => 2591d8b3eee018a0a84f671933ab6c74.png [type] => image/png [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpV7A2yC [error] => 0 [size] => 4973 ) [a] => Array ( [0] => Array ( [name] => 12711584942474_.pic_hd 1.jpg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/php5q2d1Z [error] => 0 [size] => 3007 ) [b] => Array ( [0] => Array ( [name] => 12721584942474_.pic_hd 1.jpg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpdvv8No [error] => 0 [size] => 1156 ) ) ) [c] => Array ( [0] => Array ( [name] => 12731584942474_.pic_hd.jpg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/php9tfGmp [error] => 0 [size] => 6068 ) ) [1] => Array ( [name] => background1.jpg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phplUVpzA [error] => 0 [size] => 393194 ) [2] => Array ( [0] => Array ( [name] => adliu_pip_data.xlsx [type] => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpNRtiaC [error] => 0 [size] => 36714 ) ) ) [newfile] => Array ( [0] => Array ( [0] => Array ( [name] => 数据列表 (2).xlsx [type] => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpBLG7aG [error] => 0 [size] => 77032 ) ) [s] => Array ( [name] => background1.jpg [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpjyqCFY [error] => 0 [size] => 393194 ) ) [singlefile] => Array ( [name] => [type] => image/jpeg [tmp_name] => /private/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/phpuYJXiE [error] => 0 [size] => 10273 ) )
和上面原始的 $_FILES 相比是不是清晰明了的很多?這回我們如果需要myfile[a][b][] 裡面全部的內容時,就可以使用下面的方式方便的獲取了:
re class="brush:php;toolbar:false;" >$files['myfile']['a']['b'][0]['name']; $files['myfile']['a']['b'][0]['type']; $files['myfile']['a']['b'][0]['tmp_name']; $files['myfile']['a']['b'][0]['error']; $files['myfile']['a']['b'][0]['size'];
當然,這種需求在我們的日常工作中並不多見,這裡也只是提供一個思路,將資料提前轉換成我們需要的格式是一種非常好的習慣,能夠讓我們的後續操作變得非常簡單。
以上是PHP多檔案上傳如何實作格式化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

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

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6
視覺化網頁開發工具