Создайте файл CSV с помощью PHP через fopen / fwrite, но также запишите в него заголовки - PullRequest
3 голосов
/ 28 сентября 2011

Я чувствую, что мне здесь не хватает очевидного, но я все равно отправлю.

У меня есть csv.php, который создает файл csv, простой пример:

// csv.php
$fh = fopen('report.csv', 'w') or die("can't open file");
while ($row = mysql_fetch_row($result)) { 
    fputcsv($fh, $row);
}
fclose($fh);

На отдельной странице есть простой элемент привязки, который ссылается на файл выше. Так на home.html есть:

<a href='report.csv'>Report</a>

Один пользователь запустит csv.php, а другой зайдет на home.html и щелкнет ссылку в более поздний момент времени. Это работает отлично, CSV создан, данные есть, и якорь связывается через.

Я знаю, что если бы я echo извлекал CSV, я бы добавил различные заголовки, такие как:

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

Но как мне добавить эти заголовки в файл report.csv? Я предполагаю, что это необходимо, потому что Firefox отказывается видеть CSV-файл в качестве загружаемого файла (когда щелкается привязка, он просто выводит CSV-файл в браузер).

Ответы [ 2 ]

5 голосов
/ 28 сентября 2011

Вы не сможете добавить заголовки в сам файл report.csv. Вы можете поочередно иметь прокси-скрипт, например, download.php?report=report.csv

Тогда вы бы сделали что-то вроде следующего:

$csv = file_get_contents("./csv_directory/" . preg_replace("#/#", "", $_GET['report']);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $csv;

Большая нота
Как упомянул @Pat (пока я искал подходящий синтаксис), вы можете использовать .htaccess или изменить сам httpd.conf, если вы используете apache и имеете доступ. Это, на мой взгляд, лучший способ решить вашу проблему.

2 голосов
/ 28 сентября 2011

Заголовки не являются частью файла, они являются частью ответа HTTP.

Если ваш веб-сервер не устанавливает заголовки, которые вы хотите для файлов CSV, вы, вероятно, можете убедить его сделать это.

Или, если вы не можете (или не хотите), посмотрите ответ sberry2A, чтобы передать файл через php, и таким образом управлять веб-сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...