2014-07-23 72 views
3

在我當前的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下載時,文件名就很好。代碼或瀏覽器中存在問題嗎?

+1

爲什麼不只是重命名文件? (或者乾脆擺脫問號(如果存在)?) – Kyslik

+0

輸入的文件名是動態的。它沒有硬編碼,所以我無法控制它。在項目中,用戶輸入他們的文件名,我不想限制字符。 –

回答

0

我在評論中的意思是this

str_replace('?', '_', $name); //when saving file on the server 

這種方式沒有用戶限制簡單地用_代替每個問號,我想沒什麼大不了的。

關於FF和GCH的部分我無法回答。

+0

我認爲保留'?'性格很重要。雖然謝謝! –

+0

不要告訴我你說葡萄牙語或西班牙語,我不明白爲什麼問號如此重要的文件名我只是從來沒有使用它。玩得開心找出壽! (FF和GCH問題)。 – Kyslik

+1

默認情況下,firefox/chrome已經將問號替換爲「_」或「 - 」,一直試圖urlencode但沒有成功,總是替換它 –