Symfony API上传TCPDF生成的PDF至Backblaze遇400错误及响应获取问题
问题解决:Symfony上传TCPDF生成的PDF到Backblaze
一、获取Backblaze的真实错误响应
Symfony HttpClient默认会对非2xx状态码抛出异常,导致你只能看到500错误而无法获取Backblaze的详细错误信息。需要捕获HTTP客户端异常,直接返回异常中的响应内容:
修改uploadPDF()函数,添加异常捕获逻辑:
use Symfony\Contracts\HttpClient\Exception\HttpClientExceptionInterface; public function uploadPDF(User $user, $file, $filename, $folder) { $upload = $this->getUploadUrl($user); $client = HttpClient::create([ "headers" => [ 'Authorization' => $upload["authorizationToken"], 'X-Bz-File-Name' => rawurlencode($folder . $filename), 'X-Bz-Content-Sha1' => sha1($file), 'Content-Length' => strlen($file), 'Content-Type' => "application/pdf" ] ]); try { // uploadUrl已经是完整上传端点,无需拼接额外路径 $response = $client->request('POST', $upload["uploadUrl"], [ 'body' => $file ]); return $response->getContent(); } catch (HttpClientExceptionInterface $e) { // 捕获异常并返回Backblaze的原始错误响应 return $e->getResponse()->getContent(); } }
二、正确发送字符串形式的PDF文件
针对代码中的潜在问题,做以下修正:
修正上传URL:
getUploadUrl()返回的uploadUrl已经是Backblaze提供的完整上传端点(包含/b2api/v2/b2_upload_file路径),无需再手动拼接该路径,否则会导致URL无效。文件名处理:
- 替换硬编码的
"oui.pdf",使用传入的$folder和$filename组合生成目标路径 - 用
rawurlencode()对文件名进行URL编码,符合Backblaze的文件名规范,避免特殊字符引发错误
- 替换硬编码的
验证关键参数:
sha1($file)生成的十六进制字符串完全符合Backblaze的X-Bz-Content-Sha1要求strlen($file)对TCPDF返回的二进制PDF字符串是安全的,能正确获取字节长度
三、端点代码优化
确保端点能根据响应内容返回对应状态码:
$filename = "fiche-technique_" . str_replace(' ', '-', $product->getName()) . "_" . date("Y-m-d") . ".pdf"; $pdf = $exportService->PDF_Recipe($product, $recipe, $user); $uploadResponse = $httpService->uploadPDF($user, $pdf, $filename, "product_recipe/"); $responseData = json_decode($uploadResponse, true); // 根据Backblaze的响应状态设置返回码 $statusCode = isset($responseData['status']) && $responseData['status'] >= 400 ? $responseData['status'] : 200; return new JsonResponse($responseData, $statusCode, [], true);
内容的提问来源于stack exchange,提问作者BananaPB
相关产品推荐
相关产品推荐

