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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:43:15