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

Symfony API上传图片至Backblaze报错:无法处理UploadedFile对象

问题解决方案:Symfony上传图片到Backblaze报错处理

错误核心原因

  • 计算文件SHA1哈希时,直接将UploadedFile对象传入sha1()函数,该函数无法解析对象类型,需传入文件内容或文件路径。
  • 向Backblaze发送请求时,直接传递UploadedFile对象作为请求体,Symfony HttpClient无法正确处理该对象。

修复代码

1. 路由代码优化(可选)

可以直接使用UploadedFile自带的getMimeType()方法获取MIME类型,无需手动实例化MimeTypes类:

#[Route('/http/upload-file', name:'testHttp', methods:['POST'])]
public function testHttp(HttpService $service, Request $request)
{
    $user = $this->getUser();
    $path = $request->query->get('path');
    $file = $request->files->get('image');
    
    // 直接使用UploadedFile的getMimeType()方法
    $mimeType = $file->getMimeType();
    $extension = $file->getClientOriginalExtension();
    $filename = $user->getUsername() . "_" . date("Y-m-d_His.") . $extension;
    
    $upload = $service->uploadFile($user, $file, $path, $filename, $mimeType);
    return new JsonResponse($upload, 200, [], true);
}

2. 核心修复:uploadFile()函数修改

public function uploadFile(User $user, $file, $path, $filename, $contentType)
{   
    $upload = $this->getUploadUrl($user);
    
    if (is_string($file)) {
        $fileSize = strlen($file);
        $sha1 = sha1($file);
    } else {
        // 对于UploadedFile对象,直接用getSize()获取大小
        $fileSize = $file->getSize();
        // 通过文件路径计算SHA1哈希
        $sha1 = sha1_file($file->getPathname());
    }

    $client = HttpClient::create([
        "headers" => [
            'Authorization' => $upload["authorizationToken"],
            'X-Bz-File-Name' => $path . $filename,
            'X-Bz-Content-Sha1' => $sha1,
            'Content-Length' => $fileSize,
            'Content-Type' => $contentType
        ]
    ]);
    
    // 使用文件资源流作为请求体,或直接用file选项
    $response = $client->request('POST', $upload["uploadUrl"], [
        // 方式1:打开文件资源流
        'body' => fopen($file->getPathname(), 'r')
        // 方式2:更简洁的写法,Symfony HttpClient会自动处理
        // 'file' => $file->getPathname()
    ]);

    $statusCode = $response->getStatusCode();
    $content = $response->toArray(false);
    
    if ($statusCode != 200) {
        return [
            "status" => $statusCode,
            "message" => $content["message"]
        ];
    }

    return [
        "status" => $statusCode,
        "fileId" => $content["fileId"]
    ];
}

关键修改说明

  • SHA1计算:使用sha1_file($file->getPathname())替代sha1($file),getPathname()返回上传文件在服务器的临时存储路径,sha1_file()直接基于文件内容计算哈希值,符合Backblaze的要求。
  • 请求体传递:通过fopen()获取文件资源流,或使用file选项直接传入文件路径,Symfony HttpClient会自动处理文件的流式上传,避免将对象直接传入导致的类型错误。

内容的提问来源于stack exchange,提问作者BananaPB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:53:20