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

Laravel9多图片邮件发送及文件名存储问题求助(附代码)

修正后的代码实现

Blade文件(优化accept属性,保留核心功能)

<div class="col-sm-6">                    
    <input type="file" name="files[]" accept="image/*" multiple>
</div>

Controller代码

public function saveContact(Request $request) { 
    // 验证规则:添加图片文件验证
    $this->validate($request, [
        'name' => 'required',
        'files.*' => 'image|mimes:jpeg,png,jpg,gif|max:2048' // 限制图片类型与大小(2MB)
    ]);

    // 收集格式化后的文件名,用于数据库存储
    $fileNames = [];
    if ($request->hasFile('files')) {
        $files = $request->file('files');
        foreach ($files as $index => $file) {
            $fileNames[] = 'photo' . ($index + 1);
        }
    }

    // 存储数据到MySQL
    $contact = new Contact();
    $contact->fill($request->only(['sno', 'name', 'email']));
    $contact->fileattach = implode(',', $fileNames);
    $contact->save();

    // 发送带附件的邮件
    \Mail::send('admin_email_tpl', [
        'sno' => $request->get('sno'),
        'name' => $request->get('name'),
        'email' => $request->get('email'),
        'fileNames' => $fileNames
    ], function($message) use ($request, $fileNames) {
        $message->from('123@123foobar.com');        
        $message->to('123@123foobar.com');             
        $message->subject('Thank You');

        // 添加邮件附件
        if ($request->hasFile('files')) {
            $files = $request->file('files');
            foreach ($files as $index => $file) {
                $message->attach(
                    $file->getRealPath(),
                    [
                        'as' => $fileNames[$index] . '.' . $file->getClientOriginalExtension(),
                        'mime' => $file->getMimeType()
                    ]
                );
            }
        }
    });

    return redirect()->back()->with('success', '提交成功');
}

关键修改说明

  • 文件验证与获取:新增图片格式、大小验证;用$request->hasFile('files')判断文件是否存在,替代原代码中未定义的$files变量。
  • 文件名格式化存储:循环生成photo1、photo2格式的文件名,通过implode拼接成字符串存入fileattach列。
  • 邮件附件逻辑修正:将附件添加代码移至Mail::send闭包内(原代码中$message变量未定义),附件显示名与数据库存储的格式化名称保持一致。
  • 批量赋值安全:使用fill($request->only([...]))仅填充允许的字段,需确保Contact模型的$fillable包含sno、name、email、fileattach。

补充:Contact模型配置

确保模型允许批量赋值目标字段:

class Contact extends Model
{
    protected $fillable = ['sno', 'name', 'email', 'fileattach'];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:40:59