PHP Laravel 如何获取原始 pdf 文件名并使其可下载



我想在我的laravel应用程序中创建一个页面,在那里应该可以下载一堆PDF文件。我创建了一个模型和一个控制器,在我的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 AppMaterial;
use IlluminateHttpRequest;
class MaterialController extends Controller {
public function files()
{
$files = Material::get();
return view('app.materials', compact('files'));
}
}

在我的网络.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"的内容,但我想要下载的原始名称。

我怎样才能做到这一点?

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

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

    内容处置 HTTP 标头 URL 路径
    中的最后一个段 媒体类型(来自内容类型标头
    ,数据:URL 的开头,或 blob: URL 的 Blob.type)

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

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

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

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

相关内容

最新更新