Laravel通过HTTP Client上传Base64文件失败,请求排查代码问题
Laravel对接第三方API上传Base64文件的代码问题分析
你的请求代码存在几个关键问题,导致文件上传失败并返回空响应:
1. 未设置正确的Content-Type请求头
你手动使用json_encode($content)构造请求体,但未在请求头中添加Content-Type: application/json。第三方API无法识别请求体格式,自然无法正确解析数据,导致处理失败。
2. fileData包含多余的Data URI前缀
你的fileData值带有data:application/pdf;base64,前缀,多数第三方API仅接收纯Base64编码字符串,不需要这个前缀。额外的前缀会导致API无法正确解码文件数据,最终上传失败。
3. 缺少错误处理逻辑
代码直接调用collect()->toArray(),如果请求返回4xx/5xx错误状态码,collect()会返回空集合,掩盖了实际的错误信息。你需要先检查响应状态,获取API返回的错误详情,才能定位问题。
4. 手动构造JSON请求体的写法不够稳妥
使用send方法时,直接传"body" => json_encode($content)容易出错,Laravel的Http客户端提供了更便捷的json选项,会自动处理JSON编码并设置正确的Content-Type头。
修复后的代码示例
$requestUrl = $this->baseUrl . $endpoint; // 移除fileData的Data URI前缀,只保留纯Base64字符串 $fileBase64 = substr( 'data:application/pdf;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==', strpos('data:application/pdf;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==', ',') + 1 ); $content = [ 'associatedType' => 'property', 'associatedId' => 'XXXXXXX81', 'typeId' => 'DET', 'name' => '304-Smithson-Road-Details.pdf', "isPrivate" => false, 'fileData' => $fileBase64 ]; $response = Http::withHeaders([ "api-version" => config("apiVersion"), "customer" => config("customer"), "Accept" => "application/json-patch+json", "Authorization" => "Bearer {$this->token}" ])->send($method, $requestUrl, [ // 使用json选项代替手动编码body,自动处理Content-Type "json" => $content ]); // 添加错误处理,获取详细错误信息 if ($response->failed()) { return $response->json() ?? $response->body(); } return $response->collect()->toArray();
或者更简洁的写法,直接使用对应请求方法:
$response = Http::withHeaders([ "api-version" => config("apiVersion"), "customer" => config("customer"), "Accept" => "application/json-patch+json", "Authorization" => "Bearer {$this->token}" ])->$method($requestUrl, $content);
内容的提问来源于stack exchange,提问作者Mr.Happy
相关产品推荐
相关产品推荐

