在我當前的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
輸入的文件名是動態的。它沒有硬編碼,所以我無法控制它。在項目中,用戶輸入他們的文件名,我不想限制字符。 –