You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件

针对代码中的潜在问题,做以下修正:

  1. 修正上传URL:getUploadUrl()返回的uploadUrl已经是Backblaze提供的完整上传端点(包含/b2api/v2/b2_upload_file路径),无需再手动拼接该路径,否则会导致URL无效。

  2. 文件名处理:

    • 替换硬编码的"oui.pdf",使用传入的$folder和$filename组合生成目标路径
    • 用rawurlencode()对文件名进行URL编码,符合Backblaze的文件名规范,避免特殊字符引发错误
  3. 验证关键参数:

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:32:56