Как указано в комментариях @misorude - не пытайтесь инициировать загрузку из фонового запроса, вместо этого сделайте его дружественным способом.
Предположим, у вас есть my_export_module.
В hook_menu
//(...)
//export download csv
$items['export/download-csv'] = array(
'page callback' => 'my_export_module_download_csv',
'delivery callback' => 'my_export_module_deliver_csv',
'type' => MENU_CALLBACK,
);
В my_export_module_download_csv
функция. Предположим, $input
- это двумерный массив для экспорта.
//(...)
//generate csv
//open tmp stream
$f = fopen('php://temp', 'w');
foreach ($input as $input_line) {
if (is_array($input_line)) {
fputcsv($f, $input_line, $delimiter);
}
}
fclose($f);
return array(
'name' => $output_file_name,
);
И, наконец, my_export_module_deliver_csv
функция
function my_export_module_deliver_csv($var = NULL) {
drupal_add_http_header('Content-Encoding', 'UTF-8');
drupal_add_http_header('Content-Type', 'application/csv;charset=UTF-8');
if (isset($var['name'])) {
drupal_add_http_header('Content-Disposition', 'attachment; filename="' . $var['name'] . '";');
}
if (isset($var['file'])) {
echo $var['file'];
}
}
Таким образом, файл не сохраняется на сервере, но при вводе export / download-csv он должен инициировать загрузку.