在Laravel 5.7中,我正在使用一条简单的路线来允许用户下载本地存储的csv文件。
Route::get('download/{file}', function($file) {
return Storage::disk('s3')->download($file, $file, ['Content-Type: text/csv"']);
})->name('download');
在我的Blade模板中:
<a href="{{ Route('download', ['file' => 'import.csv']) }}" class="btn btn-primary btn-sm btn-line btn-rect" data-original-title="" title=""> <i class="fa fa-download" aria-hidden="true"></i>
当用户单击链接时,Laravel正在将import.csv文件查找到s3磁盘中,并允许用户下载该文件,但添加了.txt扩展名。因此,用户正在下载import.csv.txt,此文件对应于import.csv数据。
如何防止Laravel向CSV文件添加.txt扩展名?我尝试了return Storage::disk('s3')->download($file, $file);
和return Storage::disk('s3')->download($file);
,每次都得到相同的结果。
运行环境:这是在Debian 9下运行带有PHP 7.1的Apache2的生产服务器。
EDIT1 :我在全新的Laravel 5.7安装中进行了相同的测试,相同的问题:
Route::get('/', function () {
return Storage::disk('public')->download('import.csv', 'import.csv', ['Content-Type: text/csv"','Content-disposition: attachment;filename=MyVerySpecial.csv']);});
EDIT2 :我添加了带有控制器的新测试。 路线:
Route::get('test', 'test@test');
控制器test
:
public function test()
{
return Storage::disk('public')->download('import.csv', 'import.csv', ['Content-Type: text/csv"','Content-disposition: attachment;filename=MyVerySpecial.csv']);
}
完全一样的结果
EDIT3 :已测试标头:
['Content-Type: application/octet-stream"','Content-disposition: attachment;filename="MyVerySpecial.csv"']
结果相同
EDIT4 :似乎是服务器配置问题,因为我在Firefox(最新开发者版本)而不是IE中遇到此问题
谢谢您的帮助。
EDIT5 :我认为Laravel有问题,因为如果我使用以下方法创建php文件:
<?php
$file = "../storage/app/public/import.csv";
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($file));
readfile ($file);
exit();
这与Firefox完美配合。但是如果我使用类似
的路线return Storage::disk('public')->download('import.csv', 'import.csv', ['Content-Description: File Transfer','Content-Type: application/octet-stream','Content-Disposition: attachment; filename=/home/webadmin/fresh/storage/app/public/import.csv']);
嗯,它不起作用。
问题:是否有人尝试重现相同的问题?
答案 0 :(得分:1)
此问题的答案是标题使用的格式:
Route::get('/', function () {
return Storage::disk('public')->download('import.csv', 'import.csv', ['Content-Description' => 'File Transfer','Content-Type' => 'application/octet-stream','Content-Disposition' => 'attachment; filename=import.csv']);
});
这是发送标题以下载文件的好方法,该文件已在Firefox和IE和Chrome上进行了测试
答案 1 :(得分:0)
您必须添加所有这些标题:
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');