如何用PHP的GuzzleHttp将Base64字符串转Blob并上传至REST API
使用GuzzleHttp将Base64字符串转为文件格式上传
要实现这个需求,核心是把Base64字符串解码为二进制数据,再通过Guzzle的multipart请求选项模拟FormData提交,具体步骤如下:
步骤1:处理Base64字符串
首先剥离Base64字符串的data:[mime-type];base64,前缀(如果有的话),再解码为二进制数据:
// 示例Base64字符串(带前缀) $base64String = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=='; // 剥离前缀(如果存在) if (strpos($base64String, 'base64,') !== false) { $base64String = substr($base64String, strpos($base64String, 'base64,') + 7); } // 解码为二进制数据 $binaryData = base64_decode($base64String);
步骤2:用GuzzleHttp构造上传请求
使用Guzzle的multipart选项来构建FormData,将二进制数据作为文件参数传递:
use GuzzleHttp\Client; $client = new Client(); try { $response = $client->request('POST', 'https://目标API端点地址', [ 'multipart' => [ [ 'name' => 'file', // API要求的文件字段名 'filename' => 'uploaded-file.png', // 自定义文件名,需匹配实际文件类型 'contents' => $binaryData, // 解码后的二进制数据 'headers' => [ 'Content-Type' => 'image/png' // 文件对应的MIME类型 ] ], // 如果需要其他表单字段,可在此添加 // [ // 'name' => 'other_field', // 'contents' => 'field_value' // ] ] ]); // 处理响应 $statusCode = $response->getStatusCode(); $responseBody = $response->getBody()->getContents(); echo "上传成功,状态码:{$statusCode}\n响应内容:{$responseBody}"; } catch (\GuzzleHttp\Exception\RequestException $e) { // 捕获请求异常 echo "请求失败:" . $e->getMessage(); if ($e->hasResponse()) { echo "响应内容:" . $e->getResponse()->getBody()->getContents(); } }
关键说明
multipart数组中的每个元素对应FormData中的一个项,文件项必须包含name(字段名)、filename(文件名)、contents(二进制内容)。Content-Type需要根据实际文件类型设置(比如图片是image/png,文档是application/pdf等),如果不确定可以通过Base64前缀提取,或者设置为application/octet-stream通用二进制类型。- 若目标API不需要文件名,可省略
filename字段,但多数接受Blob的API会期望这个参数。
内容的提问来源于stack exchange,提问作者tala9999
相关产品推荐
相关产品推荐

