Laravel中如何展示已上传文件路径并实现简历下载?
后台展示简历路径并实现下载功能
问题描述
我有一个表单,提交后相关信息会进入后台管理面板。现在需要在后台展示已上传简历文件的路径,并实现简历下载功能。以下是我的相关代码:
现有代码
Controller
public function store(CareerRequest $request) { $filenameWithExt = $request->file('resume')->getClientOriginalName(); $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME); $extension = $request->file('resume')->getClientOriginalExtension(); $fileNameToStore = $filename.'_'.time().'.'.$extension; $request->file('resume')->storeAs('resume', $fileNameToStore); $requestData["resume"] =$fileNameToStore ; Career::create($request->all()); return redirect()->back(); }
Model
class Career extends Model { protected $table = 'career'; protected $primaryKey = 'career_id'; public $fillable = ['username', 'email', 'phone', 'apply', 'resume']; public function getUrlAttribute(): string { return asset('upload/resume/'.$this->attributes['resume']); } }
CareerMail
class CareerMail extends Mailable { public $data; public function __construct($data) { $this->data = $data; } public function build() { return $this->subject('Career - ' . $this->data->subject) ->view('emails.career') ->attach( $this->data['resume']->getRealPath(), [ 'as' => $this->data['resume']->getClientOriginalName(), 'mime' => $this->data['resume']->getClientMimeType(), ] ); } }
解决方案
1. 修复数据存储问题
当前store方法中,Career::create($request->all())没有使用处理好的简历文件名,因为$request->all()中的resume是文件对象而非生成的文件名,需修改确保数据库存储正确值:
public function store(CareerRequest $request) { $filenameWithExt = $request->file('resume')->getClientOriginalName(); $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME); $extension = $request->file('resume')->getClientOriginalExtension(); $fileNameToStore = $filename.'_'.time().'.'.$extension; $request->file('resume')->storeAs('resume', $fileNameToStore); // 合并请求数据与处理后的简历文件名 $requestData = $request->except('resume'); $requestData['resume'] = $fileNameToStore; Career::create($requestData); return redirect()->back(); }
2. 后台展示简历路径
在后台视图中遍历简历记录时,直接输出文件名和访问路径:
@foreach($careers as $career) <tr> <td>{{ $career->username }}</td> <td>{{ $career->email }}</td> <td> <!-- 展示简历文件名 --> {{ $career->resume }} <!-- 打开文件预览 --> <a href="{{ $career->url }}" target="_blank">查看文件</a> </td> <td> <!-- 下载按钮 --> <a href="{{ route('careers.download', $career->career_id) }}" class="btn btn-sm btn-primary">下载简历</a> </td> </tr> @endforeach
3. 实现简历下载功能
首先添加下载路由:
Route::get('/careers/{career}/download', [CareerController::class, 'downloadResume'])->name('careers.download');
然后在CareerController中实现下载方法:
use Illuminate\Support\Facades\Storage; public function downloadResume(Career $career) { $filePath = 'resume/' . $career->resume; // 检查文件是否存在 if (!Storage::exists($filePath)) { abort(404, '文件不存在'); } // 返回下载响应,第二个参数为下载时显示的文件名 return Storage::download($filePath, $career->resume); }
4. 注意事项
- 确保
storage/app/resume目录具备读写权限。 - 若文件存储在
public目录,需改用Storage::disk('public')操作,并执行php artisan storage:link创建软链接。
内容的提问来源于stack exchange,提问作者Dev Patil
相关产品推荐
相关产品推荐

