Laravel 5.1,将模型导出到csv正常但无法下载

时间:2019-05-06 13:07:26

标签: php laravel csv

这是我的控制器和方法的路线:

Route::get('/designs/{catagories}', 'DesignController@catagories')->name('design.items');

我正在通过点击按钮使用javascript调用该路由:

Route::post('exportarDireccionTodos','MyController@exportarDireccionTodos');

$.ajax({ url: baseUrl+'exportarDireccionTodos', type: 'POST', data: {'id': optionsChecked}, success: function(response) { //etc 包含以下代码:

MyController

我向模型发送了一些$delimiter=";"; $array = MyModel::findMany($todos)->toArray(); $filename = "direcciones.csv"; header("Content-Transfer-Encoding: UTF-8"); header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename="'.$filename.'";'); $f = fopen('php://output', 'wb'); foreach ($array as $line) { fputcsv($f, $line, $delimiter); } fclose($f) return response()->json([ 'status' => 'success', 'mensaje' => 'Direcciones exportadas a CSV' ]); ,然后创建了一个csv文件,但是我无法下载它,只是看到它在开发人员工具XHR中制作得很好,就像这样:< / p>

enter image description here

我尝试过:

id

并带有:

header('Content-Type: application/force-download');

header('Content-Type: text/csv');

与:

return Response::download($f, $filename, $headers);  <-- here I got an error, Laravel 5.1 doesnt reconigze Response

总是发生相同的情况,csv已制作但无法下载。我尝试了另外两种创建csv的方法,但是它总是生成良好的,但是无法下载

2 个答案:

答案 0 :(得分:1)

您在上次通话中缺少标题

return response()->download($f, $filename, $headers);

我在laravel应用中使用这些标题下载文件

$headers = [
        'Content-Type' => 'application/csv',
        "Content-Description" => "File Transfer",
        "Cache-Control" => "public",
        'Content-Disposition' => 'attachment; filename="'.$filename.'"',
];

您可能比较幸运,可以暂时存储文件并生成要下载的URL

$fs = Storage::disk('local')->temporaryUrl($path, now()->addMinutes(5));

答案 1 :(得分:0)

嗯,问题是我的逻辑。我无法通过ajax调用下载文件。 我尝试过使用Laravel-Excel,但存在同样的问题。

此线程解决了我的问题:

https://github.com/Maatwebsite/Laravel-Excel/issues/848

$response = array(
        'name' => "das",
        'file' => "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,".base64_encode($archivo) //mime type of used format
    );

并在ajax中:

var a = document.createElement("a");
a.href = response.file;
a.download = response.name;
document.body.appendChild(a);
a.click();
a.remove();