Не удалось сгенерировать файл CSV с php - PullRequest
0 голосов
/ 04 мая 2018

Я хочу скачать CSV-файл, используя php. Вот что я сделал

    $filename = $reportof . '.csv';

    header('Content-type: text/csv');
    header('Content-Disposition: attachment; filename="' . $filename . '";');
    $f = fopen('php://output', 'w');
    $delimiter = ";";

    fputcsv($f, array('ID', 'Name', 'Status', 'Date', 'Rank'));
    foreach ($Reports as $line) {
        fputcsv($f, $line, $delimiter);
    }

Здесь $ Reports содержит все данные, которые я хочу в файле CSV. Я получаю эти данные в ответ, когда проверяю консоль-> сеть. Но файл не загружается. Кто-нибудь может подсказать мне, где я ошибся?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Попробуйте открыть новое окно браузера с URL-адресом, используя window.open. Браузер, вероятно, не заставит клиента открыть экран с помощью AJAX-запроса. Другой причиной может быть ваш браузер, пытающийся отобразить файл в программе просмотра, что он не может сделать. Попробуйте другой браузер?

Однако, это все еще догадка, так как вы видите содержимое на вкладке сети инспектора и не показывает нам, как вы вызываете скрипт ...

0 голосов
/ 04 мая 2018

Обязательно закройте указатель файла после того, как вы закончите запись в него.

$filename = $reportof . '.csv';

header('Content-Description: File Transfer');
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '";');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

$f = fopen('php://output', 'w');
ob_clean();

$delimiter = ';';

fputcsv($f, array('ID', 'Name', 'Status', 'Date', 'Rank'));
foreach ($Reports as $line) {
    fputcsv($f, $line, $delimiter);
}

ob_flush();
fclose($f);
die();

Edit:

Добавлены методы ob_clean() и ob_flush(), это просто для того, чтобы убедиться, что все выходные данные в вашем буфере очищены, это можно пропустить, если ничего не было записано до

Редактировать 2:

Добавлены фиктивные данные для проверки, это работает.

header('Content-Description: File Transfer');
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="test.csv";');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

$f = fopen('php://output', 'w');

$delimiter = ';';

$rs = [
    [1, 'some name1', 'open', date('c'), 1],
    [2, 'some name2', 'closed', date('c'), 2],
    [3, 'some name3', 'open', date('c'), 3],
    [4, 'some name4', 'closed', date('c'), 4],
    [5, 'some name5', 'open', date('c'), 5],
];

fputcsv($f, array('ID', 'Name', 'Status', 'Date', 'Rank'));
foreach ($rs as $line) {
    fputcsv($f, $line, $delimiter);
}

fclose($f);
die();

Это автоматически загружает CSV:

test.csv

...