php - 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”的内容,但我想要下载的原始名称。
我怎样才能做到这一点?
解决方案
download
根据MDN的属性可以以两种方式使用:
没有值,在这种情况下,文件名由:
Content-Disposition HTTP 标头
URL 路径中的最后一段
媒体类型(来自 Content-Type 标头,数据的开头:URL,或 Blob.type 的 blob:URL)带有值:在这种情况下,该值用作文件名。
\
并/
转换为下划线以防止生成非法文件名。
您的案例是用例 (2),因此您可以执行以下操作:
@foreach ($files as $file)
<a href="{{ asset('storage/'. $file->file) }}" download="{{$file->file_original_name}}">{{ $file->file_name }}</a>
@endforeach
请阅读文档以了解任何警告(例如,这不适用于跨域)。
推荐阅读
- python - 无法在 Python 中执行点
- python - 蟒蛇特质。在完成按钮触发之前更新属性
- javascript - javascript更新类时使用requestanimationframe有用吗?
- java - 在java中遍历tar.gz
- bash - Shell 循环只返回一个文件
- excel - 如何停止浏览器
- go - 如何在具有接口的 API 客户端中嵌套端点,同时保持可读性
- python - IPython,“名称'plt'未定义”
- javascript - 带有 window.pageYOffset 的滚动点/溢出-y 破坏 javascript 函数
- r - 在 ggplot 中创建自定义点划线线型 - 可以吗?