Laravel 5发送邮件时附件变为.tmp文件的问题求助
解决邮件附件显示为.tmp格式的问题
你猜的没错!问题确实出在getRealPath()上——这个方法返回的是上传文件在服务器临时目录里的路径,而临时文件的后缀本来就是.tmp,直接把这个路径传给attach()的话,Laravel就会用临时文件的默认名称作为附件名,所以收件人看到的就是.tmp后缀的文件。
下面给你两种简单的修复方案,任选其一就行:
方案一:直接传递上传文件实例(推荐)
这种方式最简洁,Laravel会自动处理文件名和MIME类型:
修改控制器代码
public function choiceAnalyst(Request $request){ $userSelect = $request->input('user'); $data = User::where('id', '=', $userSelect)->first(); // 获取上传的文件实例 $uploadedFile = $request->file('document'); // 把用户数据和文件实例一起传给Mailable Mail::to('eaquino@spi.com.ve')->send(new AnalystMonth($data, $uploadedFile)); return redirect()->route('home', ['message' => 'Correo enviado correctamente']); }
修改Mailable类代码
use Illuminate\Http\UploadedFile; // 别忘了引入这个类 class AnalystMonth extends Mailable { use Queueable, SerializesModels; public $user; public $uploadedFile; /** * Create a new message instance. * * @return void */ public function __construct(User $user, UploadedFile $uploadedFile) { $this->user = $user; $this->uploadedFile = $uploadedFile; } /** * Build the message. * * @return $this */ public function build() { // 直接传入文件实例,Laravel会自动用原始文件名 return $this->view('mails.analystMonth') ->attach($this->uploadedFile); } }
方案二:手动指定附件文件名
如果你不想传递文件实例,也可以在attach时手动设置原始文件名:
修改控制器代码
public function choiceAnalyst(Request $request){ $userSelect = $request->input('user'); $data = User::where('id', '=', $userSelect)->first(); $uploadedFile = $request->file('document'); // 把临时路径和原始文件名都存在$data里 $data->attachPath = $uploadedFile->getRealPath(); $data->originalFileName = $uploadedFile->getClientOriginalName(); Mail::to('eaquino@spi.com.ve')->send(new AnalystMonth($data)); return redirect()->route('home', ['message' => 'Correo enviado correctamente']); }
修改Mailable类代码
class AnalystMonth extends Mailable { use Queueable, SerializesModels; public $user; /** * Create a new message instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Build the message. * * @return $this */ public function build() { return $this->view('mails.analystMonth') ->attach($this->user->attachPath, [ 'as' => $this->user->originalFileName, // 指定显示的文件名 'mime' => $uploadedFile->getClientMimeType() // 可选:指定MIME类型 ]); } }
两种方案都能解决你的问题,推荐第一种,因为更符合Laravel的设计习惯,代码也更简洁。
内容的提问来源于stack exchange,提问作者Edwin Aquino
相关产品推荐
相关产品推荐

