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

多文件表单上传至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:09