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

