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

Laravel使用attachFromStorageDisk添加附件报'file'字符串偏移非法错误

解决Laravel邮件attachFromStorageDisk报错"Illegal string offset 'file'"的问题

我之前遇到过完全一样的问题,根源其实是你不小心覆盖了Laravel Mailable类自带的$attachments属性。

Laravel的Mailable基类本身就有一个protected $attachments = []属性,这个属性要求每个元素是包含'file'、'options'等键的关联数组,用来存储邮件附件的配置信息。而你在自己的Mailable里定义了同名的$this->attachments,但它是一个纯文件路径的字符串数组,当框架内部遍历这个属性时,会尝试读取每个元素的'file'键,自然就会抛出"Illegal string offset 'file'"的错误。

修复方案:

最简单的办法就是给你的附件路径数组换个名字,比如$attachmentPaths,然后修改你的代码:

// 在你的Mailable类里定义属性时换个名字
protected $attachmentPaths;

// 构造函数里赋值(示例,根据你的实际构造逻辑调整)
public function __construct($emailSubject, $attachmentPaths)
{
    $this->emailSubject = $emailSubject;
    $this->attachmentPaths = $attachmentPaths;
}

public function build() { 
    $email = $this->view('emails.message')->subject($this->emailSubject); 
    foreach ($this->attachmentPaths as $attachment) { 
        $email->attachFromStorageDisk('filemanager', $attachment); 
    } 
    return $email; 
}

另一种可选方案(不推荐,易混淆):

如果你坚持要用$attachments这个名字,那就要按照Laravel要求的格式构造数组,但这样会和attachFromStorageDisk的调用逻辑冲突,不如上面的方法清晰:

// 构造附件数组时遵循Laravel的格式
foreach ($attachmentPaths as $attachment) {
    $this->attachments[] = [
        'file' => Storage::disk('filemanager')->path($attachment),
        // 可选:添加自定义文件名、MIME类型等选项
        'options' => [
            'as' => '自定义文件名.pdf',
            'mime' => 'application/pdf',
        ]
    ];
}

// 此时build方法里不需要手动循环调用attachFromStorageDisk,框架会自动处理
public function build() { 
    return $this->view('emails.message')
                ->subject($this->emailSubject);
}

推荐第一种方案,既清晰又避免了和框架内置属性的冲突。

内容的提问来源于stack exchange,提问作者Daniel R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:03:30