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;