多文件表单上传至Backblaze报错:filesize()文件名含空字节
问题描述
我有一个带2个文件输入框的表单,需要选择文件上传到Backblaze。下面是我编写的图片上传函数,参数为从表单获取的文件路径:
public function uploadImage($path) { try { // 获取文件名 $fileName = $path->getClientOriginalName(); // 获取文件内容 $contents = file_get_contents($path->getRealPath()); // 上传到Backblaze Storage::disk('b2')->put($fileName, $contents); dd('上传成功!'); } catch (\Throwable $e) { dd($e); } }
遇到了如下错误:
ErrorException {#2033 ▼ // app\Http\Livewire\quote\NewQuote.php:89 #message: "filesize(): 文件名包含空字节" #code: 0 #file: "C:\Users\Usuario\Desktop\Dev\CRM\vendor\marcandreappel\flysystem-backblaze\src\BackblazeAdapter.php" #line: 45 #severity: E_WARNING trace: {▶} }
解决方案
这个错误是因为文件名中包含了null字节(\0),导致filesize函数无法正常解析。可以从以下几个方向修复:
清理文件名非法字符
对获取到的文件名做过滤,移除空字节及Backblaze不允许的特殊字符:$fileName = str_replace("\0", '', $path->getClientOriginalName()); // 可进一步过滤其他非法字符,比如非数字字母、点、横线以外的内容 $fileName = preg_replace('/[^\w\.\-]/u', '', $fileName);使用Laravel原生文件上传方法
没必要手动读取文件内容,直接传入文件对象让Storage自动处理,避免路径相关问题:public function uploadImage($file) { try { // 保留原文件名上传 Storage::disk('b2')->putFileAs('', $file, $file->getClientOriginalName()); dd('上传成功!'); } catch (\Throwable $e) { dd($e); } }若不需要保留原文件名,也可以用
putFile自动生成随机文件名:$uploadedPath = Storage::disk('b2')->putFile('images', $file);验证文件有效性
确保传入的参数是合法的上传文件对象,调用函数前可先做校验:if (!$path instanceof \Illuminate\Http\UploadedFile || !$path->isValid()) { dd('无效的上传文件'); }
内容的提问来源于stack exchange,提问作者Asturies
相关产品推荐
相关产品推荐

