2011-06-30 23 views
6

我的代碼適用於IE和FF。在Chrome瀏覽器中,瀏覽器會在文件名的開始和結尾添加「 - 」連字符,因此無法識別文件類型。重命名文件時保存爲csv使它在Excel中打開在一個單元中,但我想要一個解決方案在代碼中處理它。這似乎很難。Chrome在下載的CSV文件中附加了連字符「 - 」

下面是我的代碼:

//fileName = xxxx.csv 
response.setContentType("application/download"); 
response.setHeader("Cache-Control", "public"); 
response.setHeader("Content-Type", "application/octet-stream"); 
response.setHeader("Content-Disposition", "attachment; filename= \"" + fileName + "\""); 

注:我搜索了許多博客,但沒有找到Chrome瀏覽器的解決方案。

+0

你有沒有試過它沒有引號周圍的文件名? –

回答

7

我看到兩件事情:

  1. 你不應該有後空間,在你Content-Disposition
  2. 我從未在文件名周圍使用過引號;我不認爲你的意思是。我沒有看到the RFC中使用引號的任何信息,所以我會擺脫它們。

我希望你會看到一個連字符,因爲Chrome會用連字符替換空格或引號(更可能),因爲它會在操作系統上考慮文件名的引號無效字符。

FWIW,我的工作Content-Disposition標題是這樣的:

Content-Disposition: attachment;filename=someFileName.csv

題外話:回覆您的發言:

我的代碼適用於IE和FF。在Chrome瀏覽器中,瀏覽器會在文件名稱的開始和結尾附加「 - 」字樣,因此無法識別文件類型。

瀏覽器應該(而且主要是)根據MIME類型識別文件類型,而不是文件擴展名。您可能需要將Content-Type設置爲text/csv而不是application/octet-stream。 (當然,如果你正在談論操作系統在後面對文件做什麼,這是另一回事。)

4

這是Chrome的一個缺陷/功能。 https://code.google.com/p/chromium/issues/detail?id=69939

貌似鉻認爲文件名的報價部分,但 意識到他們是一個文件名,有效字符等 將它們轉換成連字符。

RFC2183定義了Content-Disposition標頭,但沒有說明如果服務器將文件名用引號引起來應該發生什麼 。

http://www.ietf.org/rfc/rfc2183.txt (從1日評論)

必須從內容處置的文件名部分去掉引號。我不確定空白文件名中沒有引號會發生什麼情況。這需要測試。

0

儘管無效字符可能會導致發生這種情況,但這種尾隨連字符文件名問題只發生在與答案答案列出的情況不同的情況下。

Long yesterday = new Date().getTime() - (1000*60*60*24); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

String theCsv = "stuff,stuff\n yeah, uhuh\n"; 

//This sends a normal file 
Attachment att = new Attachment("myfile.csv", theCsv.getBytes(), "UTF-8"); 
sendEmailWithAttachment("[email protected]","Me","[email protected]","Stuff for "+sdf.format(yesterday) ,"", att); 

//This sends one with a trailing hyphen!! 
String fileName = sdf.format(yesterday)+"-myfile.csv"; 
fileName = fileName.replaceAll(" ", "").replaceAll("\"", ""); 
Attachment att = new Attachment(fileName, theCsv.getBytes(), "UTF-8"); 
sendEmailWithAttachment("[email protected]", "Me","[email protected]","Stuff for "+sdf.format(yesterday),"", att); 

我無法解釋這一點。在我的情況下問題不是引號或空格 - 唯一的區別是預解析的文件名。也許嘗試沒有字符串concats的文件名?

0
$response->sendHeaders(); 
$response->sendContent(); 

用以下單行代碼替換上面兩行。

$response->send(); 

它可能會工作。