本文目录导读:

在 PHP 中处理 PUT 请求数据有以下几种方法:
使用 php://input 流(推荐)
表单格式数据
<?php
// 获取 PUT 请求的原始数据
$putData = file_get_contents('php://input');
// 解析表单格式数据 (application/x-www-form-urlencoded)
parse_str($putData, $postData);
// 使用数据
echo $postData['name'] ?? '未提供姓名';
echo $postData['email'] ?? '未提供邮箱';
JSON 格式数据
<?php
// 获取 JSON 格式的 PUT 请求数据
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);
// 使用数据
if ($data) {
echo $data['name'] ?? '未提供姓名';
echo $data['email'] ?? '未提供邮箱';
} else {
echo '无效的 JSON 数据';
}
综合示例 - 处理不同类型的 PUT 请求
<?php
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
// 获取请求的 Content-Type
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
// 获取原始数据
$putData = file_get_contents('php://input');
// 根据 Content-Type 解析数据
if (strpos($contentType, 'application/json') !== false) {
// JSON 格式
$data = json_decode($putData, true);
} else {
// 表单格式
parse_str($putData, $data);
}
// 处理数据
if ($data) {
$response = [
'status' => 'success',
'message' => 'PUT 数据接收成功',
'data' => $data
];
} else {
$response = [
'status' => 'error',
'message' => '无法解析 PUT 数据'
];
}
echo json_encode($response);
} else {
http_response_code(405);
echo json_encode(['error' => '只支持 PUT 请求']);
}
封装为通用函数
<?php
/**
* 获取 PUT 请求数据
* @return array 解析后的数据数组
*/
function getPutData() {
// 获取原始数据
$putData = file_get_contents('php://input');
// 获取 Content-Type
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
$data = [];
// 判断数据类型
if (strpos($contentType, 'application/json') !== false) {
// JSON 数据
$data = json_decode($putData, true);
} elseif (strpos($contentType, 'multipart/form-data') !== false) {
// multipart/form-data 数据
// 需要额外的处理
$data = parseMultipartData($putData, $contentType);
} else {
// 默认当作表单数据处理
parse_str($putData, $data);
}
return $data;
}
/**
* 解析 multipart/form-data 格式数据
*/
function parseMultipartData($data, $contentType) {
$result = [];
// 获取 boundary
preg_match('/boundary=(.*)$/', $contentType, $matches);
$boundary = $matches[1] ?? '';
// 简单的 multipart 解析
if ($boundary) {
$parts = explode('--' . $boundary, $data);
foreach ($parts as $part) {
if (preg_match('/name="([^"]+)"/', $part, $nameMatch)) {
$name = $nameMatch[1];
$value = trim(str_replace(['\r\n', '"'], '', substr($part, strpos($part, "\r\n\r\n") + 4)));
$result[$name] = $value;
}
}
}
return $result;
}
// 使用示例
$putData = getPutData();
print_r($putData);
处理 PUT 请求中的文件上传
<?php
// 对于 multipart/form-data 类型的 PUT 请求
$putData = file_get_contents('php://input');
// 获取 boundary
preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'] ?? '', $matches);
$boundary = $matches[1] ?? '';
// 解析文件和字段
$parts = explode('--' . $boundary, $putData);
foreach ($parts as $part) {
// 检查是否为文件
if (preg_match('/filename="([^"]+)"/', $part, $fileMatch)) {
$filename = $fileMatch[1];
// 获取文件内容
$fileContent = substr($part, strpos($part, "\r\n\r\n") + 4);
$fileContent = rtrim($fileContent, "\r\n");
// 保存文件
file_put_contents('uploads/' . $filename, $fileContent);
}
// 检查是否为普通字段
if (preg_match('/name="([^"]+)"/', $part, $nameMatch)) {
$fieldName = $nameMatch[1];
$fieldValue = trim(substr($part, strpos($part, "\r\n\r\n") + 4));
echo "$fieldName: $fieldValue\n";
}
}
结合框架使用(如 Laravel)
<?php
// Laravel 框架中处理 PUT 请求
Route::put('/user/{id}', function($id) {
// 直接从 request 获取数据
$name = request('name');
$email = request('email');
// 或者使用 Request 对象
$data = request()->all();
// 更新用户
return response()->json([
'status' => 'success',
'data' => $data
]);
});
测试 PUT 请求的示例代码
<?php
// 客户端发送 PUT 请求示例
// 方法1:使用 cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'name' => '张三',
'email' => 'zhangsan@example.com'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 方法2:使用 AJAX
// 前端代码示例
?>
<script>
fetch('http://example.com/api/data', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: '张三',
email: 'zhangsan@example.com'
})
})
.then(response => response.json())
.then(data => console.log(data));
</script>
注意事项
- PHP 版本兼容性:
file_get_contents('php://input')在 PHP 5.6+ 版本中均可使用 - 内存限制:处理大文件时要注意设置适当的内存限制
- 安全考虑:始终验证和过滤输入数据
- 数据格式:根据
Content-Type头部选择合适的解析方式
选择哪种方法取决于你的具体需求和数据结构,最常用和推荐的是使用 file_get_contents('php://input') 结合 parse_str 或 json_decode 来解析数据。