2014-02-11 79 views
1

我試圖讓用戶下載一個文件,並且它在Firefox中完美運行。我的問題變成了,在Chrome中,它似乎不接受我在標題中給出的文件名,它只是忽略它並創建它自己的東西,而且我注意到它發送的雙重標題相同。適用於Chrome的HTTP頭

HTTP/1.1 200 OK 
Date: Tue, 11 Feb 2014 16:25:19 GMT 
Server: Apache/#.#.## (Linux OS) 
X-Powered-By: PHP/#.#.## 
Cache-Control: private 
Pragma: public 
Content-Description: File Transfer 
Content-Disposition: attachment; filename="Filename_3_from_2014_02_11_11_25_19_Custom.csv" 
Content-Transfer-Encoding: binary 
Content-Length: 9 
Cache-Control: private 
Pragma: public 
Content-Description: File Transfer 
Content-Disposition: attachment; filename="Filename_3_from_2014_02_11_11_25_19_Custom.csv" 
Content-Transfer-Encoding: binary 
X-ChromePhp-Data: <Stuff here> 
X-Debug-Token: 2f50fc 
Connection: close 
Content-Type: text/plain; charset=UTF-8 

這是一個從上面生成的文件是Filename_3_from_2014_02_11_11_25_19_Custom.csv-, attachment這比什麼頭告訴它得到明顯不同。

發送頭中的代碼如下:

// Generate response 
      $response = new Response(); 
      // Set headers 
      $response->headers->set('Pragma', 'public'); 
      $response->headers->set('Cache-Control', 'private', false); 
      $response->headers->set('Content-Type', 'text/plain'); 
      $response->headers->set('Content-Description', 'File Transfer'); 
      $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); 
      $response->headers->set('Content-Type', 'text/plain'); 
      $response->headers->set('Content-Transfer-Encoding', 'binary'); 
      $response->headers->set('Content-Length', strlen($filedata)); 

我缺少一個標頭,鍍鉻的需求,或者我需要巧妙地改變這些標題之一,使其按預期工作?我已經嘗試過應用程序/強制下載,應用程序/ vnd.ms-excel作爲其用於Excel使用的CSV,但它們都不起作用。

我試過這個問題的事情:HTTP Headers for File Downloads但似乎沒有任何工作。

回答

3

這個問題很多玩耍後,事實證明,這個問題是由於我早發送標題,然後返回也是我的響應對象。由於這一點,頭文件被髮送了兩次,Firefox似乎完全滿意,但Chrome變得非常困惑,並且改變了文件名以表明問題已經出現,但仍允許用戶下載文件。

基本上,我不得不刪除說$response->sendHeaders();並簡單地返回對象,從而解決雙頭問題,文件名稱格式不正確的行。

+0

我真的愛你,只是花了幾個小時試圖調試爲什麼重複的頭文件被返回。我的 - > before()事件正在調用return $ response-> send()而不是僅僅返回$ response;再次感謝! –

+0

我想知道爲什麼: $ response-> headers-> set('Access-Control-Allow-Origin','*'); $ response-> sendHeaders(); 給我:「Access-Control-Allow-Origin'標頭包含多個'*,*'值,但只允許有一個值。」在Chrome中。感謝您爲我解決這個問題! – Fx32

1

嘗試

<?php 

use Symfony\Component\HttpFoundation\Response; 

//... 

$file = '/path/of/your/file'; 

return new Response(file_get_contents($file), 200, array(
    'Content-Disposition' => 'inline; filename="'.$file.'"' 
)); 
+0

這不是一個實際存在的文件,而是它實時收集的數據。其實,這可能嗎?我應該使用內聯處置而不是附件嗎? – Gyhth

+0

file_get_contents(http://fr.php.net/file_get_contents)返回一個字符串。我將這種方式用於任何類型的文件 – VBee

+0

它已經將數據作爲字符串獲取,因爲它是使用數據庫中的信息構建的。我會嘗試內聯,看看是否會達到我需要的。 更新:即使更改爲內聯,相同的問題,現在它的.csv-,內聯在文件名的末尾。 – Gyhth