Как исправить значение имени файла в заголовке Content-Disposition?

0

Этот фрагмент кода РЕАЛЬНО решает мою проблему, сохраняя запрос на .csv через php - однако я не могу понять, почему, когда он предлагает мне сохранить как export.csv, этот файл открывается пустым, в то время как file.csv сохраняет отлично в одно и то же время с данными, которые мне нужны. Я уверен, что что-то очевидное происходит с заголовками. Может ли кто-нибудь помочь?

*** РЕДАКТИРОВАТЬ ниже предложения привел меня к этому состоянию, и он больше не сохраняет файл и запрашивает пустой, но теперь корректный файл показывает с ним хард HTML. В этом скрипте нет другого HTML - я пробовал предложения из многих других сообщений. Как я могу решить?

$query = "SELECT * from Table";

$result = mysqli_query($connS, $query);

   $headers = $result->fetch_fields();
foreach($headers as $header) {
    $head[] = $header->name;
}
$fp = fopen('php://output', 'w');

header('Content-Disposition: attachment; filename="export.csv"');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
    fputcsv($fp, array_values($head)); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    $fp = fopen('file.csv', 'w');
    readfile($fp);
    fclose($fp);

end();
  • 0
    Я отредактировал заголовок вашего вопроса, включив в него название заголовка, который вы используете, чтобы больше людей, знакомых с предметом, увидели его. Я также удалил blockquote из вашего кода, потому что он здесь избыточен - обратитесь к справке по редактированию для получения дополнительной информации о форматировании.
Теги:
csv
header

1 ответ

0

В настоящее время вы сохраняете содержимое только в файле, а не отправляете его в браузер пользователя. Возможно, попробуйте добавить вызов readfile перед выражением die.

Таким образом, ваши последние строки будут выглядеть так:

    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    readfile($fp);
    die; 
}

Readfile читает файл и записывает его в выходной буфер. Вы можете найти более подробную информацию о readfile функции здесь.


Обратите внимание, что способ, которым вы в данный момент выполняете это (сохранение файла до того, как пользователь может загрузить), если два пользователя нажимают на эту страницу одновременно, они, вероятно, будут топать на пальцах друг друга (и создать нечетное смешение двух созданных CSV), Вы можете попытаться просто вывести содержимое CSV непосредственно в браузер пользователя, используя код в принятом ответе. Если вы сделаете это после своих заголовков, это приведет к тому, что браузер обработает его как файл, который будет загружен.

  • 0
    Я отредактировал его так, чтобы он использовал «$ fp = fopen ('php: // output', 'w')», который теперь сохраняет его правильно, но с мусором HTML в конце. Другие ответы, кажется, рекомендуют ob_clean, но это не похоже на это. Это сделано только для одного человека, поэтому я не так беспокоюсь о трафике.
  • 0
    Что за «дерьмо HTML» это показывает?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню