PHP boundary是指在使用multipart/form-data上傳文件時,用于分隔不同部分的界限。通過boundary參數指定不同的邊界,避免上傳的文件數據被混淆,保證數據的完整性。
我們來看一個簡單的上傳文件的例子:
在后端的upload.php文件中,我們可以通過如下代碼獲取上傳的文件:
$file = $_FILES['file'];
使用var_dump輸出文件變量,我們可以看到文件被轉化為了類似以下的格式:
array(5) { ["name"]=>string(9) "test1.txt" ["type"]=>string(10) "text/plain" ["tmp_name"]=>string(14) "/tmp/phpGdYq9r" ["error"]=>int(0) ["size"]=>int(5) }
在multipart/form-data上傳文件時,文件的內容被分割成了不同的部分,每個部分都有自己的頭部信息和實際內容。這些部分被boundary參數分隔開來。boundary參數的值由一些比較隨機的字符串構成,例如:
------------------------9d8d46c361e8d3e Content-Disposition: form-data; name="file"; filename="test1.txt" Content-Type: text/plain test1 ------------------------9d8d46c361e8d3e--
在這里,boundary的值是------------------------9d8d46c361e8d3e,前面是--,后面是--。文件的頭部信息包含了Content-Disposition和Content-Type,然后是空行,緊接著是文件的實際內容。
如果上傳的文件僅僅是一個,那么使用boundary來分隔文件也并不是必須的。但如果上傳的文件比較多,就需要使用boundary來區分不同的文件,這通常是自動完成的。
我們繼續之前的例子,如果同時上傳兩個文件的話:
那么上傳的實際內容會被分成兩個部分,每個部分都有自己的boundary值:
------------------------b7e3fc8dd9ab8e4 Content-Disposition: form-data; name="file1"; filename="test1.txt" Content-Type: text/plain test1 ------------------------b7e3fc8dd9ab8e4 Content-Disposition: form-data; name="file2"; filename="test2.txt" Content-Type: text/plain test2 ------------------------b7e3fc8dd9ab8e4--
以上是兩個文件各自分隔的一部分,共用同一個boundary值。我們可以通過使用正則表達式從每個部分中提取出文件名和文件內容。
最后,需要注意的是,boundary的值不能包含某些特殊字符,例如“+”,在實際使用中最好不要手動指定boundary的值,而是讓PHP自動處理。如果需要獲取boundary的值,可以使用以下代碼:
$boundary = isset($_SERVER['HTTP_CONTENT_TYPE']) ? substr($_SERVER['HTTP_CONTENT_TYPE'], strlen('multipart/form-data; boundary=')) : null;