2014-07-23 68 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但没有成功,总是替换它 –