Как создать и загрузить csv-файл из php-скрипта?
Я начинающий программист, и я много искал о своем вопросе, но не смог найти полезного решения или учебника об этом.
моя цель-у меня есть массив PHP, и элементы массива отображаются в списке на странице.
Я хочу добавить опцию, чтобы, если пользователь хочет, он / она мог создать CSV-файл с элементами массива и загрузить его.
Я не знаю, как это делать. Я тоже много искал. Но все же найти какой-либо полезный ресурс.
пожалуйста, предоставьте мне учебник или решение или совет, чтобы реализовать его самостоятельно. Поскольку я новичок, пожалуйста, предоставьте простые в реализации решения.
мой массив выглядит так:
Array
(
[0] => Array
(
[fs_id] => 4c524d8abfc6ef3b201f489c
[name] => restaurant
[lat] => 40.702692
[lng] => -74.012869
[address] => new york
[postalCode] =>
[city] => NEW YORK
[state] => ny
[business_type] => BBQ Joint
[url] =>
)
)
5 ответов
вы можете использовать встроенный в fputcsv() для ваших массивов для генерации правильных строк csv из вашего массива, поэтому вам придется перебирать и собирать строки. например:
$f = fopen("tmp.csv", "w");
foreach ($array as $line) {
fputcsv($f, $line)
}
чтобы браузеры предлагали диалог "Сохранить как", вам нужно будет отправить HTTP-заголовки (подробнее об этом заголовке см. в rfc):
header('Content-Disposition: attachment; filename="filename.csv";');
собираем все вместе:
function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
// open raw memory as file so no temp files needed, you might run out of memory though
$f = fopen('php://memory', 'w');
// loop over the input array
foreach ($array as $line) {
// generate csv lines from the inner arrays
fputcsv($f, $line, $delimiter);
}
// reset the file pointer to the start of the file
fseek($f, 0);
// tell the browser it's going to be a csv file
header('Content-Type: application/csv');
// tell the browser we want to save it instead of displaying it
header('Content-Disposition: attachment; filename="'.$filename.'";');
// make php send the generated csv lines to the browser
fpassthru($f);
}
и вы можете использовать его как это:
array_to_csv_download(array(
array(1,2,3,4), // this array is going to be the first row
array(1,2,3,4)), // this array is going to be the second row
"numbers.csv"
);
обновление:
Вместо php://memory
вы также можете использовать php://output
для дескриптора файла и покончить с поиском и тому подобное:
function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="'.$filename.'";');
// open the "output" stream
// see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
$f = fopen('php://output', 'w');
foreach ($array as $line) {
fputcsv($f, $line, $delimiter);
}
}
у меня недостаточно репутации, чтобы ответить на решение @complex857. Он отлично работает, но я должен был добавить ; в конце заголовка Content-Disposition. Без него браузер добавляет две тире в конце имени файла (например, вместо " export.csv "файл сохраняется как" экспорт.csv--"). Вероятно, он пытается санировать \r\n в конце строки заголовка.
правильная строка должна выглядеть так:
header('Content-Disposition: attachment;filename="'.$filename.'";');
в случае, если в CSV есть символы UTF-8, вам нужно изменить кодировка в UTF-8 путем изменения строки типа содержимого:
header('Content-Type: application/csv; charset=UTF-8');
кроме того, я считаю более элегантным использовать rewind () вместо fseek ():
rewind($f);
Спасибо за ваше решение!
Try...
csv download.
<?php
mysql_connect('hostname', 'username', 'password');
mysql_select_db('dbname');
$qry = mysql_query("SELECT * FROM tablename");
$data = "";
while($row = mysql_fetch_array($qry)) {
$data .= $row['field1'].",".$row['field2'].",".$row['field3'].",".$row['field4']."\n";
}
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="filename.csv"');
echo $data; exit();
?>
используйте приведенный ниже код для преобразования массива php в CSV
<?php
$ROW=db_export_data();//Will return a php array
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
$fp = fopen('php://output', 'w');
foreach ($ROW as $row) {
fputcsv($fp, $row);
}
fclose($fp);
если структура массива всегда будет многомерной именно таким образом, то мы можем перебирать такие элементы:
$fh = fopen('somefile.csv', 'w') or die('Cannot open the file');
for( $i=0; $i<count($arr); $i++ ){
$str = implode( ',', $arr[$i] );
fwrite( $fh, $str );
fwrite( $fh, "\n" );
}
fclose($fh);
Это один из способов сделать это ... вы можете сделать это вручную, но этот способ быстрее и проще понять и прочитать.
тогда вы будете управлять своими заголовками что-то, что complex857 делает, чтобы выплюнуть файл. Затем вы можете удалить файл с помощью unlink () если вы больше не нужны, или вы могли бы оставьте его на сервере, если хотите.