我想在我的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
属性可以以两种方式使用:
-
没有值,在这种情况下,文件名由 :
内容处置 HTTP 标头 URL 路径
中的最后一个段 媒体类型(来自内容类型标头
,数据:URL 的开头,或 blob: URL 的 Blob.type) -
带值:在这种情况下,该值用作文件名。
和
/
将转换为下划线,以防止生成非法文件名。
您的案例是用例 (2),因此您可以执行以下操作:
@foreach ($files as $file)
<a href="{{ asset('storage/'. $file->file) }}" download="{{$file->file_original_name}}">{{ $file->file_name }}</a>
@endforeach
请阅读文档以了解任何警告(例如,这不适用于跨源)。