Laravel上传图片至FTP服务器时如何保留原文件名而非生成哈希名?
问题描述
已成功将图片文件上传至FTP服务器,但文件名是自动生成的哈希值,希望上传的文件名与原图片文件名一致。目前数据库中保存的是未哈希的原文件名,但FTP服务器上的文件名却是哈希格式。
- FTP服务器上的文件示例:文件名是自动生成的哈希字符串(如长串无意义字符)
- 数据库中保存的文件名示例:与本地原文件名完全一致(如
example.jpg)
现有控制器代码
$lampiran = Lampiran_tte::where('surat_tte_id', $surat->id); if ($request->hasfile('lampiran_gambar')) { $files = []; foreach ($request->file('lampiran_gambar') as $file) { if ($file->isValid()) { $filename = $file->getClientOriginalName(); $file->store('/lampiranSurat', 'ftp') . '/' . $filename; $files[] = [ 'lampiran_gambar' => $filename, ]; } } $gambar = ''; foreach ($files as $value) { $gambar .= $value['lampiran_gambar'].'#'; } $gambar = substr($gambar, 0, -1); $lampiran->update([ 'isi_lampiran' => $request->isi_lampiran, 'lampiran_gambar' => $gambar, 'update_by' => Auth::user()->name, ]); }
解决方案
问题根源是store()方法默认会生成哈希文件名,改用storeAs()方法即可指定原文件名存储。
修改后的代码:
$lampiran = Lampiran_tte::where('surat_tte_id', $surat->id); if ($request->hasfile('lampiran_gambar')) { $files = []; foreach ($request->file('lampiran_gambar') as $file) { if ($file->isValid()) { $filename = $file->getClientOriginalName(); // 使用storeAs指定存储目录、原文件名和磁盘 $file->storeAs('/lampiranSurat', $filename, 'ftp'); $files[] = [ 'lampiran_gambar' => $filename, ]; } } $gambar = ''; foreach ($files as $value) { $gambar .= $value['lampiran_gambar'].'#'; } $gambar = substr($gambar, 0, -1); $lampiran->update([ 'isi_lampiran' => $request->isi_lampiran, 'lampiran_gambar' => $gambar, 'update_by' => Auth::user()->name, ]); }
关键说明
storeAs()参数:第一个是存储目录,第二个是要保存的原文件名,第三个是指定使用的存储磁盘(这里为ftp)- 原代码中
$file->store(...) . '/' . $filename只是拼接字符串,没有实际作用,直接替换为storeAs()即可实现按原文件名上传
内容的提问来源于stack exchange,提问作者gagaltotal666
相关产品推荐
相关产品推荐

