Laravel 5.1中的数组到CSV文件下载

时间:2017-04-28 15:03:12

标签: php laravel csv response-headers downloadfile

我有一个数组,我正在尝试将其下载为csv文件 我的数组看起来像这样

Array(
[0] => Array
    (
        [Date] => 2017-01-02
        [Name] => Asia consumer MC Alpha bmk - risk
        [Level] => .333000
    )

[1] => Array
    (
        [Date] => 2017-01-03
        [Name] => Asia consumer MC Alpha bmk - risk
        [Level] => .333000
    ))

将数组转换为文件的代码是

public function DownloadFile($filetype,$Array_data,$content){

    $LevelArray = array('Date','Name','Level');

    $selected_array =  $LevelArray;
    if($filetype =='csv'){

            $Filename ='Level.csv';
            header('Content-Type: text/csv; charset=utf-8');                
            header('Content-Disposition: attachment; 
            filename='.$Filename.'');
            // create a file pointer connected to the output stream
            $output = fopen('php://output', 'w');
            fputcsv($output, $selected_array);
            foreach ($Array_data as $row){
                fputcsv($output, $row);
            }
            fclose($output);                
        }}

作为响应我在响应时得到输出但是响应没有转换成文件类型,尽管标题指向从中获取csv文件。

 Date,Name,Level
2017-01-02,"Asia consumer MC Alpha bmk - risk",.333000
2017-01-03,"Asia consumer MC Alpha bmk - risk",.333000
2017-01-04,"Asia consumer MC Alpha bmk - risk",.333000

我已经尝试过使用laravel的响应方法而且很多其他似乎也没有用,它的标题无法强制浏览器下载文件

RESPONSE标题看起来像这样

Connection:close
Content-Disposition:attachment; filename=Benchmark-Level.csv
Content-type:text/csv;charset=UTF-8
Host:localhost:8000
X-Powered-By:PHP/5.6.25

1 个答案:

答案 0 :(得分:0)

你的第2个标题分为2行吗?它必须是一行,没有换行符。

<?php

$selected_array = array('header:col1','header:col2', 'header:col3');

$Array_data = array(
    array('row1:col1','row1:col2', 'row1:col3'),
    array('row2:col1','row2:col2', 'row2:col3'),
    array('row3:col1','row3:col2', 'row3:col3'),
);

$Filename ='Level.csv';
header('Content-Type: text/csv; charset=utf-8');
Header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename='.$Filename.'');
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputcsv($output, $selected_array);
foreach ($Array_data as $row){
    fputcsv($output, $row);
}
fclose($output);
?>

修改

这段代码对我有用。我添加了一个标题以强制下载,但它可以在Chrome中使用或不使用额外的标头。你可以尝试在不同的浏览器中运行它吗?我的想法是有浏览器设置 阻止下载。

>>> import collections
>>> class Thing(collections.namedtuple('Thing', ['x', 'y'])):
    pass

>>> def create_thing():
        x = 42
        y = 24
        return Thing(**locals())

>>> create_thing()
Thing(x=42, y=24)