У меня есть некоторый PHP-код, который выполняет запрос к базе данных, сохраняет результаты в файл csv, а затем позволяет пользователю загрузить файл. Проблема в том, что файл csv содержит HTML-страницу с фактическим содержимым csv.
Я уже читал здесь все связанные вопросы, включая этот . К сожалению, мой код существует в Joomla, поэтому даже если я попытаюсь перенаправить на страницу, которая не содержит ничего, кроме заголовков, Joomla автоматически окружит ее своим собственным кодом навигации. Это происходит только во время загрузки; Если я посмотрю на файл csv, который сохранен на сервере, он не содержит HTML.
Может ли кто-нибудь помочь мне с помощью способа принудительной загрузки фактического файла csv в том виде, в котором он находится на сервере, а не как браузер его редактирует, чтобы быть? Я пробовал использовать расположение заголовка, например:
header('Location: ' . $filename);
, но он открывает файл в браузере, а не вызывает диалоговое окно сохранения.
Вот мой текущий код:
//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "
Line: " . __LINE__ . "{$query}
" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename);
exit;
EDITS
Может ли кто-нибудь помочь мне с принудительной загрузкой фактического файла csv в том виде, в каком он находится на сервере, а не в том виде, в каком он редактируется браузером? Я пробовал использовать расположение заголовка, например:
header('Location: ' . $filename);
, но он открывает файл в браузере, а не вызывает диалоговое окно сохранения.
Вот мой текущий код:
//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "
Line: " . __LINE__ . "{$query}
" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename);
exit;
EDITS
Может ли кто-нибудь помочь мне с принудительной загрузкой фактического файла csv в том виде, в каком он находится на сервере, а не в том виде, в каком он редактируется браузером? Я пробовал использовать расположение заголовка, например:
header('Location: ' . $filename);
, но он открывает файл в браузере, а не вызывает диалоговое окно сохранения.
Вот мой текущий код:
//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "
Line: " . __LINE__ . "{$query}
" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename);
exit;
EDITS Полный URL-адрес выглядит так:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers
с фактической ссылкой для скачивания, которая выглядит так:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export
БОЛЬШЕ ИЗМЕНЕНИЙ Вот снимок страницы, на которой находится код; сгенерированный файл все еще втягивает HTML для подменю. Код для выбранной ссылки (Экспорт в CSV) теперь
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Вот скриншот сгенерированного сохраненного файла:
Здесь он уменьшился во время загрузки, но текст, выделенный желтым цветом, является HTML-кодом для subnav (список клиентов, добавление нового клиента, экспорт в CSV). Вот как теперь выглядит мой полный код; если бы я мог просто избавиться от этого последнего кусочка html, это было бы идеально.
$fp= fopen("php://output", 'w');
$query = "select c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone, a.company, a.address1,
a.address2,a.city,a.state,a.zip,c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id
order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "
Line: " . __LINE__ . "{$query}
" . mysql_error());
$counter = 1;
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
ОБНОВЛЕНИЕ ДЛЯ BJORN
Вот код (я думаю), который работал у меня. Используйте параметр RAW в ссылке, вызывающей действие:
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Поскольку это было процедурным, наша ссылка находилась в файле с именем customers.php, который выглядит следующим образом:
switch ($r['subtask']){
case 'add':
case 'edit':
//if the form is submitted then go to validation
include("subnav.php");
if ($r['custFormSubmitted'] == "true")
include("validate.php");
else
include("showForm.php");
break;
case 'delete':
include("subnav.php");
include("process.php");
break;
case 'resetpass':
include("subnav.php");
include("resetpassword");
break;
case 'export':
include("export_csv.php");
break;
default:
include("subnav.php");
include("list.php");
break;
}
Итак, когда пользователь щелкнул ссылку выше, Файл export_csv.php включается автоматически. Этот файл содержит весь фактический код:
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
$fp= fopen("php://output", 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "
Line: " . __LINE__ . "{$query}
" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);