2017-06-14 146 views
0

我目前正试图在用户的浏览器中下载文件,但至今无法实现。强制PHP通过浏览器下载文件

我已经在stackoverflow.com上看过其他答案,到目前为止还没有发现任何已经解决了我的问题。

我的过程如下:

我创建的文件名和文件路径,然后套头:

$date = new DateTime(); 
$currentDateTime = $date->format("Y-m-d H:i:s"); 
$filename = "{$name}_{$currentDateTime}.csv"; 
$filepath = $rootfull . "/{$filename}"; 

// Set headers 
header('Content-Type: application/csv'); 
header('Content-Disposition: attachment; filename="' . $filepath . '"'); 
header('Content-Length: ' . filesize($filepath)); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header("Content-Transfer-Encoding: binary"); 
header('Pragma: no-cache'); 

我然后创建该文件,并开始写它:

// Write header 
fputcsv($output, $header); 
fputcsv($output, array()); // Empty line 

// Write column names 
$column_headers = array_keys(array_flip($columns)); 

foreach ($data as $row) 
{ 
    fputcsv($output, $row); 
} 

echo readfile($filepath); 
die(); 

该文件被生成并写入到指定的位置(在这种情况下,/var/www/<project>/<filename>.csv没有任何指示给用户发生任何事情,没有下载对话框,没有任何内容。

如果任何人都可以发现我的代码或我的过程出现问题,请指出并且最好提出一个更好的/可选的方式,现在我们欢迎任何帮助。

+1

您之前创建的文件*发送的头吧? – ficuscr

+2

只是'readfile($ file_url);''不''echo' – rtfm

+1

@ficuscr在发送头文件之前,您不需要创建文件,就在您尝试将文件读回给用户之前。 –

回答

1

如果没有好处(芒缓存差)到写入磁盘,那么也许是这样写缓冲:

<?php 

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename="dump_' . date('Ymd') . '.csv"'); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
$this->outputCSV($results); 
exit(); //-> 

public function outputCSV($data, $useKeysForHeaderRow = true) 
{ 
    if ($useKeysForHeaderRow) { 
     array_unshift($data, array_keys(reset($data))); 
    } 
    $outputBuffer = fopen("php://output", 'w'); 
    foreach($data as $v) { 
     fputcsv($outputBuffer, $v); 
    } 
    fclose($outputBuffer); 
} 
?> 
+0

感谢您的回复,但不幸的是,这并没有什么区别 - 文件仍然没有下载到浏览器中。 – Skytiger

+0

奇怪。从正在使用的代码复制该代码。也许你的浏览器是问题。 – ficuscr

+1

尽可能多,谢谢你的回答,但希望它可以帮助未来的人:) – Skytiger

相关问题