首页 > 解决方案 > PHP Laravel 如何获取原始 pdf 文件名并使其可下载

问题描述

我想在我的laravel-application 中创建一个页面,应该可以下载一堆PDF-files。我已经创建了一个模型和一个控制器,并且在我的 Nova 后端中,我上传了一些 pdf 文件。

我的新星领域:

public function fields(Request $request) {
   return [
      Text::make('File name', 'file_name')
        ->rules('required'),

      File::make('Download', 'file')
        ->disk('public')
        ->path('materials')
        ->storeOriginalName('file_original_name')
        ->storeSize('file_size')
        ->prunable(),
   ];
}

然后我的模型:

class Material extends Model {
   protected $fillable = [
    'file_name', 'file', 'file_original_name', 'file_size'
   ];
}

和我的控制器:

use App\Material;
use Illuminate\Http\Request;

class MaterialController extends Controller {
  public function files()
   {
      $files = Material::get();
      return view('app.materials', compact('files'));
   }
}

在我的 web.php 中,我这样做:

Route::get('materials', 'MaterialController@files')->name('materials');

在我的刀片视图中:

@foreach ($files as $file)
   <a href="{{ asset('storage/'. $file->file) }}" download>{{ $file->file_name }}</a>
@endforeach

到目前为止,这是可行的,但是当原始文件名例如为“myfile.pdf”时,会 $file->file返回类似于“dadjafmdahdyda2e23as.pdf”的内容,但我想要下载的原始名称。

我怎样才能做到这一点?

标签: phplaravellaravel-5.7

解决方案


download根据MDN的属性可以以两种方式使用:

  1. 没有值,在这种情况下,文件名由:

    Content-Disposition HTTP 标头
    URL 路径中的最后一段
    媒体类型(来自 Content-Type 标头,数据的开头:URL,或 Blob.type 的 blob:URL)

  2. 带有值:在这种情况下,该值用作文件名。\/转换为下划线以防止生成非法文件名。

您的案例是用例 (2),因此您可以执行以下操作:

@foreach ($files as $file)
   <a href="{{ asset('storage/'. $file->file) }}" download="{{$file->file_original_name}}">{{ $file->file_name }}</a>
@endforeach

请阅读文档以了解任何警告(例如,这不适用于跨域)。


推荐阅读