Laravel 5.7存储下载CSV文件添加了.txt扩展名

时间:2019-02-07 12:51:51

标签: php laravel csv

在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']);

嗯,它不起作用。

问题:是否有人尝试重现相同的问题?

2 个答案:

答案 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"');