在我当前的CodeIgniter项目中有一个下载的CSV功能。当用户点击链接时,它会以CSV格式下载文件。代码中提供的文件名具有问号字符后,下载的CSV文件的文件名不正确。为了清楚起见,下面是代码。在Firefox中下载csv文件缺陷
public function download($role = NULL, $id = 0, $eid = 0) {
$this->load->helper('download');
$list = $this->respondent->get_respondents($eid);
$questions = $this->respondent->get_all_questions($eid);
$fp = fopen('php://output', 'w');
$fields = array(
'Timestamp',
'First Name',
'Middle Name',
'Last Name',
);
$fields = array_merge($fields, $questions);
fputcsv($fp, $fields);
foreach ($list as $respondent) {
$respondent_data = array(
$respondent->since,
$respondent->first_name,
$respondent->middle_name,
$respondent->last_name,
);
$query = $this->respondent->get_responses($respondent->rid);
foreach($query as $response) {
array_push($respondent_data, $response->answer, $response->duration);
}
fputcsv($fp, $respondent_data);
}
$data = file_get_contents('php://output');
$name = $this->respondent->get_experiment($respondent->eid)->title.'.csv';
// Build the headers to push out the file properly.
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Disposition: attachment; filename="'.basename($name).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: close');
exit();
force_download($name, $data);
fclose($fp);
}
在行header('Content-Disposition: attachment; filename="'.basename($name).'"');
,一旦$name
有一个问号字符,在下载Firefox或Chrome浏览器中的文件不能正确地解释它。生成的字符不是问号字符,而是分别为下划线或连字符。但是,当使用Safari下载时,文件名就很好。代码或浏览器中存在问题吗?
为什么不只是重命名文件? (或者干脆摆脱问号(如果存在)?) – Kyslik
输入的文件名是动态的。它没有硬编码,所以我无法控制它。在项目中,用户输入他们的文件名,我不想限制字符。 –