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
相关产品推荐
相关产品推荐

